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 da2ba11..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.properties
+++ /dev/null
@@ -1,144 +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
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Apache MyFaces Trinidad Tag Support (Optional)
-
-# "copyright" property - text of the "Feature Update Copyright"
-feature.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\
-June 7, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 8e25d12..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature"
-      label="%featureName"
-      version="2.1.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <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 a450af9..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.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.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 da7c265..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,147 +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
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "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=\
-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\
-June 06, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 d2e5e6e..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/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, 2008</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.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 7aafb97..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties
+++ /dev/null
@@ -1,144 +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
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Apache MyFaces Trinidad Tag Support (Optional) SDK
-
-# "copyright" property - text of the "Feature Update Copyright"
-feature.copyright=\
-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\
-\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\
-June 7, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 5ab6a1a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature"
-      label="%featureName"
-      version="2.1.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <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 bc691ab..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.properties
+++ /dev/null
@@ -1,144 +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
-###############################################################################
-# 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
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Web Page Editor (Optional)
-
-# "copyright" property - text of the "Feature Update Copyright"
-feature.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\
-June 7, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 f499445..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.webpageeditor.feature"
-      label="%featureName"
-      version="2.1.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.debug.ui" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.emf.ecore" version="2.2.0" match="compatible"/>
-      <import plugin="org.eclipse.gef" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.jface.text" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.wst.sse.ui" version="1.0.101"/>
-      <import plugin="org.eclipse.jst.jsp.core" version="1.1.0"/>
-      <import plugin="org.eclipse.jst.jsp.ui" version="1.1.0"/>
-      <import plugin="org.eclipse.jst.pagedesigner.jsp.core" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.common.ui" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.ui.ide" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.jdt.ui" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.common" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.core" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.jdt.core" version="3.2.0" match="compatible"/>
-      <import plugin="javax.servlet" version="2.4.0" match="compatible"/>
-      <import plugin="org.apache.commons.el" version="1.0.0" match="compatible"/>
-      <import plugin="javax.servlet.jsp" version="2.0.0" match="compatible"/>
-      <import plugin="org.eclipse.ui.views.properties.tabbed" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.core.resources" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.wst.common.ui" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.wst.common.uriresolver" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.jst.j2ee" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.jst.j2ee.web" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.wst.html.ui" version="1.0.100" match="equivalent"/>
-      <import plugin="org.eclipse.wst.css.core" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.wst.html.core" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.wst.xml.ui" version="1.0.100" match="equivalent"/>
-      <import plugin="org.eclipse.wst.xml.core" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.wst.sse.core" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.jst.jsf.facesconfig" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.pagedesigner" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.pagedesigner.jsp.core" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.wst.common.modulecore" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.jst.jsf.common.ui" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.core" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.common" version="1.1.0" match="compatible"/>
-   </requires>
-
-   <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 a450af9..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.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/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 bea5ceb..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,147 +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.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Source code zips for Web Page Editor.
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-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\
-June 06, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 fec4a48..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/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.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 4686754..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties
+++ /dev/null
@@ -1,144 +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
-###############################################################################
-# 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
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Web Page Editor (Optional) SDK
-
-# "copyright" property - text of the "Feature Update Copyright"
-feature.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\
-June 7, 2007\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 Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-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.org CVS\n\
-repository ("Repository") in CVS 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? 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\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-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\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-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". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-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\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\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\
-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,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. 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 735ccf8..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.webpageeditor_sdk.feature"
-      label="%featureName"
-      version="2.1.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <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 a450af9..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_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/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 608d8b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Wed Feb 13 10:01:00 PST 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.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-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 bced9d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,26 +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.0.101.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.2.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.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 aa99bac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.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.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 1fa8aea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml
+++ /dev/null
@@ -1,1433 +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="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>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background-color:#e9e8e8;padding:0px;margin:1px;"/>
-					</operation>
-					<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.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;"/>
-					</operation>
-					<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="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.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;"/>
-					</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"
-					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.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background-color:#e9e8e8;padding:0px;margin:1px;"/>
-					</operation>
-					<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.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;"/>
-					</operation>
-					<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.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="styleClass"/>
-							<parameter value="class"/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-							<parameter value="color:#669966;font-family:Courier,sans-serif;"/>
-						</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.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="styleClass"/>
-							<parameter value="class"/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-							<parameter value="color:#669966;font-family:monospace;font-weight:bold;"/>
-						</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.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="styleClass"/>
-							<parameter value="class"/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-							<parameter value="color:#669966;font-family:monospace;font-weight:bold;"/>
-						</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.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="styleClass"/>
-							<parameter value="class"/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-							<parameter value="color:#cc0000;font-family:monospace;font-weight:bold;"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="X"/>
-						</operation>
-					</operation>
-				</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="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.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal;"/>
-					</operation>
-					<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.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;"/>
-					</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.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.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="style"/>
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966;border-color:#99cc99;border-style:solid;border-width:1px;"/>
-					</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>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation">
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;"/>
-					</operation>
-					<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="style"/>
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;"/>
-					</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="style"/>
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;margin:0px 3px;"/>
-					</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="style"/>
-						<parameter value="font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;"/>
-					</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 1abc91f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml
+++ /dev/null
@@ -1,100 +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.IfNotOperation">
-						<parameter value="@styleClass"/>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@inlineStyle"/>
-							<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-								<parameter value="style"/>
-								<parameter value="background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;"/>
-							</operation>
-						</operation>
-					</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 53c9353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml
+++ /dev/null
@@ -1,110 +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.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.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>
-   </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/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 02407b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java
+++ /dev/null
@@ -1,114 +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 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;
-
-}
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 a276157..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.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.apache.trinidad.tagsupport;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-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;
-	}
-
-	/*
-	 * (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));
-	}
-
-}
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 4232cc3..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,250 +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.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;
-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 STYLE_OUTERELEMENT = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;"; //$NON-NLS-1$
-	private static final String STYLE_LABELTD = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal;"; //$NON-NLS-1$
-	private static final String STYLE_REQUIREDSPAN = "color:#669966;font-family:Courier,sans-serif;"; //$NON-NLS-1$
-	protected static final String STYLE_CONTROLELEMENT = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;"; //$NON-NLS-1$
-	private static final String STYLE_HELPSPAN = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#669966;"; //$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
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, outerElement);
-		appendAttribute(outerElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_OUTERELEMENT, srcElement, "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, "style", STYLE_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, "style", STYLE_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, "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$
-				Element spanElement = appendChildElement("span", tdElement); //$NON-NLS-1$
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-							new String[]{"styleClass", "class"}); //$NON-NLS-1$  //$NON-NLS-2$
-				operation.transform(srcElement, spanElement);
-				appendAttribute(spanElement, "style", //$NON-NLS-1$
-						calculateStyle(STYLE_HELPSPAN, srcElement, "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 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 83e3929..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,122 +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;
-	}
-
-}
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 a3ce1d3..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,44 +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$
-		}
-		appendAttribute(controlElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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 585fda3..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,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.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, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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 f412a7d..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,70 +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$
-		}
-		appendAttribute(inputElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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/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 780ec11..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,166 +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.
-	 */
-
-	/* (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[]{"styleClass", "class"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-
-		//deal with styleClass, inlineStyle, and styleUsage to mimic runtime
-		String style = null;
-		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$
-					style = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;"; //$NON-NLS-1$
-				} else if (styleUsage.equals("pageStamp")) { //$NON-NLS-1$
-					style = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;"; //$NON-NLS-1$
-				} else if (styleUsage.equals("inContextBranding")) { //$NON-NLS-1$
-					style = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999;"; //$NON-NLS-1$
-				}
-			}
-		}
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			if (style != null) {
-				style += inlineStyle;
-			} else {
-				style = inlineStyle;
-			}
-		}
-		if (style != null) {
-			appendAttribute(spanElement, "style", style); //$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 b1578c0..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 STYLE_REQUIREDSPAN = "color:#669966;font-family:Courier,sans-serif;"; //$NON-NLS-1$
-	private static final String STYLE_GROUPSEPARATOR = "background-color:gray;height:1px;font-size:1px;margin-top:3px;margin-bottom:3px;"; //$NON-NLS-1$
-	private static final String STYLE_LABELCELL = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal;"; //$NON-NLS-1$
-	private static final String STYLE_FIELDCELL = "padding:1px 0px;"; //$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$
-		} else {
-			appendAttribute(outerTableElement, "style", "width:100%;"); //$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$
-		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");
-		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);
-		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, "style", STYLE_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, "style", STYLE_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, "style", STYLE_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, "style", STYLE_GROUPSEPARATOR); //$NON-NLS-1$
-	}
-
-	private Element buildFooterStart(
-			Element parentElement, int columnCount, String labelWidth) {
-		Element tdElement = appendChildElement("td", parentElement);
-		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("%")) {
-				try {
-					int iLabelWidth = Integer.parseInt(labelWidth.substring(0, labelWidth.length() - 1));
-					iLabelWidth = iLabelWidth / columnCount;
-					footerLabelWidth = String.valueOf(iLabelWidth) + "%";
-					footerFieldWidth = String.valueOf(100 - iLabelWidth) + "%";
-				} 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$ //$NON-NLS-2$
-		}
-		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$ //$NON-NLS-2$
-		}
-		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 e6641df..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,290 +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;
-
-	/* (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 tableStyle;
-		if (above) {
-			tableStyle = "background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:1px 0px 0px;"; //$NON-NLS-1$
-		} else {
-			tableStyle = "background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:0px 0px 1px;"; //$NON-NLS-1$
-		}
-		appendAttribute(tableElement, "style", tableStyle); //$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, "style", "width:0%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else if (sepPosition == SEP_POS_END) {
-			appendAttribute(tdElement, "style", "width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		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 tdStyle;
-		if (isDisclosed && !isDisabled) {
-			tdStyle = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;padding:0px 8px;"; //$NON-NLS-1$
-		} else {
-			tdStyle = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 8px;"; //$NON-NLS-1$
-		}
-		appendAttribute(tdElement, "style", tdStyle); //$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 15c31d7..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,65 +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);
-			}
-		}
-		appendAttribute(spanElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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 b69db5f..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,91 +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);
-		}
-		//TODO: append option elements
-		appendAttribute(selectElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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 d28008c..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,73 +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$
-				}
-			}
-		}
-		appendAttribute(spanElement, "style", //$NON-NLS-1$
-				calculateStyle(STYLE_CONTROLELEMENT, srcElement, "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 218d10a..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,257 +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 STYLE_HEADER = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;color:#669966;font-weight:bold;padding:0px 0px 0px 18px;"; //$NON-NLS-1$
-	private static final String STYLE_REQUIRED = "color:#669966;font-family:Courier,sans-serif;"; //$NON-NLS-1$
-	private static final String STYLE_LISTCOLUMN = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;"; //$NON-NLS-1$
-	private static final String STYLE_SELECT = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;"; //$NON-NLS-1$
-	private static final String STYLE_DESCRIPTION = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;"; //$NON-NLS-1$
-	private static final String STYLE_LINK = "font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;"; //$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); //$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, "style", STYLE_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, "style", STYLE_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, "style", STYLE_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, "style", STYLE_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, "style", STYLE_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); //$NON-NLS-1$
-			}
-		}
-		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, "style", STYLE_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); //$NON-NLS-1$
-		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, "style", STYLE_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/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 41e0716..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties
+++ /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
-#
-###############################################################################
-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
\ 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 0064ab3..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)); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		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 ce73933..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="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<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.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 4f79f7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Wed Jan 09 14:34:02 PST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-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=warning
-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=warning
-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.3
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 b96fe12..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.0.101.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.runtime.internal.JSFCommonRuntimePlugin
-Require-Bundle: org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-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 12619e4..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");
-        propExclude.add("componentTypeInfo");
-        propExclude.add("valueChangeListeners");
-        propExclude.add("visitableChildren");
-
-        _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 bf5f356..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");
-        if (value != null)
-        {
-            Object converter = attributes.get("converter");
-            Object localValue = attributes.get("localValue");
-            
-            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 2b2e921..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 = "";
-
-        if (_forClasses.length  > 0)
-        {
-            toString = "For-Classes: [";
-            for (int i = 0; i < _forClasses.length; i++)
-            {
-                toString += _forClasses[i];
-                if (i < _forClasses.length-1)
-                {
-                    toString += ", ";
-                }
-            }
-            toString += "], ";
-        }
-        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/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/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 23a8098..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,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.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();
-
-    /**
-     * 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 aabf975..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 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 3a67c5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Thu Sep 27 16:19:18 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=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=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.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 b298e51..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.1.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 11f17a1..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 "";
-        }
-
-        StringBuffer buffer = new StringBuffer("#");
-        int[] intRGBs = new int[] { rgb.red, rgb.green, rgb.blue };
-        for (int i = 0; i < 3; i++) {
-            if (intRGBs[i] < 16) {
-                buffer.append("0");
-            }
-            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 431dae4..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");
-		}
-        this._listener = listener;
-	}
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public void setLabelText(String labeltext) {
-		_labelText = labeltext == null ? "" : labeltext;
-		// 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$
-				label = _labelText;
-			} else {
-				label = ".";
-			}
-
-			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
-						| SWT.WRAP);
-				_requiredLabel.setForeground(getLabelColor());
-			}
-			if (_isRequired) {
-				_requiredLabel.setText(DialogFieldResources.getInstance()
-						.getString("DialogFieldBase.Label.RequiredSymbol"));
-			}
-		}
-		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 lable
-	 */
-	private Color getLabelColor() {
-		String osname = System.getProperty("os.name").toLowerCase();
-		if (osname.startsWith("mac os")) {
-			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, "");
-		} 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 e58971c..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(); //$NON-NLS-1$
-
-	/**
-	 * 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 f3130f1..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)) {
-				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 3a6aa5c..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";
-
-	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 0fac773..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 = "";
-
-	/**
-	 * @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
-				| 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 37af05b..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);
-		if (project == null) {
-			throw new IllegalArgumentException(
-					"Argument(project) cannot be null");
-		}
-		_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 "";
-		}
-		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])) {
-					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 84409ca..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[] { "" };
-		}
-		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 f8b4323..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);
-
-            _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 40e28cc..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.");
-		}
-		if (plugin == null) {
-			throw new NullPointerException(
-					"No plugin was provided to the Alerts.");
-		}
-		_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 ae80858..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
- */
-public class BrowserWindow extends ApplicationWindow {
-	/**
-	 * 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("<b>Loading...</b>");
-		}
-
-		// 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_nav_16.gif"));
-		_backItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.back.tooltip"));
-		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_nav_16.gif"));
-		_forwardItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.forward.tooltip"));
-		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_nav_16.gif"));
-		stopItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.stop.tooltip"));
-		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_nav_16.gif"));
-		refreshItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.refresh.tooltip"));
-		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_nav_16.gif"));
-			reloadItem.setToolTipText(JSFUICommonPlugin
-					.getResourceString("BrowserWindow.reload.tooltip"));
-			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 73fd31c..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,
-				GridData.BEGINNING | GridData.CENTER);
-
-		// Add favorite text field
-		SWTUtils.createLabel(favGroup, JSFUICommonPlugin
-				.getResourceString("favorites.label"), 1);
-		_favoriteCombo = SWTUtils.createCombo(favGroup, _favorites
-				.getFavoritesList(), 1, comboMinWidth, true);
-		_favoriteCombo.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.tooltip"));
-		_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"));
-		saveButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.save.tooltip"));
-		saveButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() == 0) {
-					favName = JSFUICommonPlugin
-							.getResourceString("favorites.default");
-				}
-				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"));
-		removeButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.remove.tooltip"));
-		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 e8fd6f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
+++ /dev/null
@@ -1,348 +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 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.gif"));
-			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("No Introduction");
-
-			setDescription("No Introduction page configuration found in the plugin.xml");
-		}
-
-		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));
-				}
-			}
-			else
-			{
-				JSFUICommonPlugin.getLogger(this.getClass()).error(new Throwable("Image Descriptor not found for "+element));
-			}
-		}
-
-		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",
-							hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.IntroductionSection.action.error", hyperlink,
-							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");
-		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/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 032081e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
+++ /dev/null
@@ -1,285 +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 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.gif")); //$NON-NLS-1$
-		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",
-									hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.OverviewSection.action.error", hyperlink, 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
-	 * @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 a1decc9..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(",");
-	}
-
-	/**
-	 * 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/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 94bc039..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);
-			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);
-		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 + "!!";
-        }
-    }
-}
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 e625fd6..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";
-    
-    /**
-     * 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";
-    
-    /**
-     * 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";
-
-    /**
-     * 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";
-
-    /**
-     * 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";
-
-}
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 b0e4cbf..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$
-			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$
-			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
-					: 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 5745f3f..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 = "";
-		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("")) {
-			return uri;
-		}
-		String webroot = "";
-		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)) //$NON-NLS-1$
-		{
-			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("");
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path("");
-			}
-			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("");
-	}
-	
-	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 57a2b97..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";
-
-	private static final String STR_BOUNDS_END = ".bounds"; // assumes the
-
-	// 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);
-	}
-
-	/**
-	 * @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, ",");
-        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)
-				.equals("" + true);
-	}
-
-	// ///////////////////////////////////////////////////////////////////////
-	// 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, "");
-		localProperties.store(os, "");
-		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");
-		// 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")
-					+ System.getProperty("file.separator")
-					+ encodeFilename(baseName);
-		}
-        return System.getProperty("user.dir")
-        		+ System.getProperty("file.separator")
-        		+ 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 = "";
-
-		for (int ii = 0; ii < names.length; ii++) {
-			tmpString = tmpString + (ii > 0 ? "." : "")
-					+ PropertyUtils.encodeName(names[ii]);
-		}
-		if (subsystemName.startsWith(".") == false)
-			tmpString += ".";
-		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(",");
-				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 + ","
-				+ 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, "");
-		} catch (IOException ee)// NOPMD
-		{
-            JSFUICommonPlugin.getLogger(PropertyUtils.class).error("saving properties", ee);
-		}
-		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 a556772..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>");
-    
-    // pattern to strip all <x> and </x> HTML tags
-    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>");
-    
-    // pattern to find all runs of spaces longer than one
-    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+");
-    
-	/**
-	 * 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("");
-		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(" ");
-				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 "";
-		}
-        
-		String result = htmlToNewline.matcher(text).replaceAll("\n"); 
-        result = removeHTMLTags.matcher(result).replaceAll("");
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" ");
-
-		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 bbe343d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.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.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
-
-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.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 = "";
-		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) {
-			return ComponentCore.createComponent(project).getRootFolder().getUnderlyingFolder().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 = "";
-		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");
-		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);
-			}
-		}
-		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 5ad6b19..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);
-    		}
-		}
-		
-		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.common/.classpath b/jsf/plugins/org.eclipse.jst.jsf.common/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.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/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.common/.cvsignore
deleted file mode 100644
index 2a89e4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.options b/jsf/plugins/org.eclipse.jst.jsf.common/.options
deleted file mode 100644
index 41f99dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jst.jsf.common/debug=false
-org.eclipse.jst.jsf.common/debug/metadataload=false
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.project b/jsf/plugins/org.eclipse.jst.jsf.common/.project
deleted file mode 100644
index 8bd8da5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.common</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/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ae7ce73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:00:59 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b1a7584..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,81 +0,0 @@
-#Thu Apr 03 15:56:45 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=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.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.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/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.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/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index ae4a084..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:41:40 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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
deleted file mode 100644
index b617290..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,63 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.common;singleton:=true
-Bundle-Version: 1.1.4.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.JSFCommonPlugin$Implementation
-Bundle-Localization: plugin
-Export-Package: org.eclipse.jst.jsf.common;x-internal:=true,
- org.eclipse.jst.jsf.common.dom,
- org.eclipse.jst.jsf.common.internal;x-friends:="org.eclipse.jst.jsf.core",
- org.eclipse.jst.jsf.common.internal.managedobject;x-internal:=true,
- org.eclipse.jst.jsf.common.internal.policy;x-internal:=true,
- org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.common.internal.strategy;x-internal:=true,
- org.eclipse.jst.jsf.common.internal.types;
-  x-friends:="org.eclipse.jst.jsf.core,
-   org.eclipse.jst.jsf.core.tests,
-   org.eclipse.jst.jsf.validation.el.tests,
-   org.eclipse.jst.jsf.designtime.tests,
-   org.eclipse.jst.jsf.context.symbol.tests",
- org.eclipse.jst.jsf.common.metadata,
- org.eclipse.jst.jsf.common.metadata.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.common.metadata.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.query,
- org.eclipse.jst.jsf.common.metadata.query.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes,
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.common.sets,
- org.eclipse.jst.jsf.common.sets.constraint,
- org.eclipse.jst.jsf.common.sets.mapping,
- org.eclipse.jst.jsf.common.util,
- org.eclipse.jst.jsf.contentmodel.annotation,
- org.eclipse.jst.jsf.contentmodel.annotation.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.context,
- org.eclipse.jst.jsf.context.resolver,
- org.eclipse.jst.jsf.context.resolver.structureddocument,
- org.eclipse.jst.jsf.context.resolver.structureddocument.internal;x-friends:="org.eclipse.jst.jsf.core,org.eclipse.jst.jsf.contentassist.tests",
- org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.structureddocument,
- org.eclipse.jst.jsf.context.structureddocument.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol,
- org.eclipse.jst.jsf.context.symbol.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.internal.provider;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.internal.source;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.provider,
- org.eclipse.jst.jsf.context.symbol.source
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %plugin.provider
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/about.html b/jsf/plugins/org.eclipse.jst.jsf.common/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/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/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common/build.properties
deleted file mode 100644
index 1d865d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/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
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               bin/,\
-               build.properties,\
-               plugin.properties,\
-               about.html,\
-               plugin.xml,\
-               icons/,\
-               model/,\
-               schema/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif
deleted file mode 100644
index 6c05b46..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif
deleted file mode 100644
index 7d24707..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro.gif
deleted file mode 100644
index 48d014d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro_indexable.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro_indexable.gif
deleted file mode 100644
index acc8b31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_ro_indexable.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw.gif
deleted file mode 100644
index 9f7abd5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw_indexable.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw_indexable.gif
deleted file mode 100644
index 7daac85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_rw_indexable.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo.gif
deleted file mode 100644
index 9783d84..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo_indexable.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo_indexable.gif
deleted file mode 100644
index 158758e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol_wo_indexable.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol.gif
deleted file mode 100644
index 185f84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol_local.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol_local.gif
deleted file mode 100644
index 790f06a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentBeanSymbol_local.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol.gif
deleted file mode 100644
index 1208917..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol_local.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol_local.gif
deleted file mode 100644
index ed15fea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentInstanceSymbol_local.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif
deleted file mode 100644
index 347a8ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif
deleted file mode 100644
index f8294d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif
deleted file mode 100644
index 9250fec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol.gif
deleted file mode 100644
index 1e5345f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_app.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_app.gif
deleted file mode 100644
index 7bb14f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_app.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_none.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_none.gif
deleted file mode 100644
index c3b0941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_none.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_request.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_request.gif
deleted file mode 100644
index b3f0dc9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_request.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_session.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_session.gif
deleted file mode 100644
index 1eee8aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IManagedBeanSymbol_session.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol.gif
deleted file mode 100644
index e135a7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol_intermediate.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol_intermediate.gif
deleted file mode 100644
index 71c252b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundlePropertySymbol_intermediate.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleSymbol.gif
deleted file mode 100644
index 7d0f811..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleTypeDescriptor.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMessageBundleTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif
deleted file mode 100644
index c8d381f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif
deleted file mode 100644
index 33854e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore
deleted file mode 100644
index 9b202c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore
+++ /dev/null
@@ -1,100 +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="metadata"
-    nsURI="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" nsPrefix="md">
-  <eClassifiers xsi:type="ecore:EClass" name="Model" eSuperTypes="#//Entity">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="metadatamodel"/>
-    </eAnnotations>
-    <eOperations name="findIncludeGroup" eType="#//EntityGroup">
-      <eParameters name="groupId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="accept">
-      <eParameters name="visitor" eType="#//IEntityVisitor"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="entityGroups" upperBound="-1"
-        eType="#//EntityGroup" eKeys="#//Entity/id #//Entity/type">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="entityGroup"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceModelProvider" unique="false"
-        eType="#//IMetaDataSourceModelProvider" volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currentModelContext" eType="#//ModelContext"
-        volatile="true" transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EntityGroup" eSuperTypes="#//Entity"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Entity">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="entity"/>
-    </eAnnotations>
-    <eOperations name="accept">
-      <eParameters name="visitor" eType="#//IEntityVisitor"/>
-    </eOperations>
-    <eOperations name="getModel" eType="#//Model"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childEntities" upperBound="-1"
-        eType="#//Entity" containment="true" eKeys="#//Entity/id #//Entity/type">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="entity"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="traits" upperBound="-1"
-        eType="#//Trait" containment="true" eKeys="#//Trait/id">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="trait"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <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="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="includeGroups" upperBound="-1"
-        eType="#//IncludeEntityGroup">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="include-entity-group"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IncludeEntityGroup">
-    <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="modelUri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value="uri"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Trait">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="trait"/>
-    </eAnnotations>
-    <eOperations name="accept">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="body" value="visitor.visit(this);"/>
-      </eAnnotations>
-      <eParameters name="visitor" eType="#//ITraitVisitor"/>
-    </eOperations>
-    <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="value" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"
-        containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceModelProvider" eType="#//IMetaDataSourceModelProvider"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ITraitVisitor" instanceClassName="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor"
-      serializable="false"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IEntityVisitor" instanceClassName="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor"
-      serializable="false"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IMetaDataSourceModelProvider" instanceClassName="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="ModelContext" instanceClassName="org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor"/>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel
deleted file mode 100644
index 4707b0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel
+++ /dev/null
@@ -1,65 +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.common/src" editDirectory="/org.eclipse.jst.jsf.common/src"
-    editorDirectory="/org.eclipse.jst.jsf.common/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="Metadata" editPluginClass="org.eclipse.jst.jsf.common.metadata.MetadataPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.common.metadata.MetadataPlugin" generateSchema="true"
-    testsDirectory="/org.eclipse.jst.jsf.common/src" testSuiteClass="/org.eclipse.jst.jsf.common.metadata.MetadataAllTests"
-    importerID="org.eclipse.emf.importer.ecore">
-  <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/exporter/org.eclipse.xsd.ecore.exporter">
-    <genAnnotations source="selectedPackages">
-      <details key="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" value="metadata.xsd"/>
-    </genAnnotations>
-    <details key="directoryURI" value="schema/"/>
-  </genAnnotations>
-  <foreignModel>metadata.ecore</foreignModel>
-  <genPackages prefix="Metadata" basePackage="org.eclipse.jst.jsf.common" resource="XML"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" ecorePackage="metadata.ecore#/">
-    <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/exporter/org.eclipse.xsd.ecore.exporter">
-      <genAnnotations source="schema/metadata.xsd"/>
-    </genAnnotations>
-    <genDataTypes ecoreDataType="metadata.ecore#//ITraitVisitor"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//IEntityVisitor"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//IMetaDataSourceModelProvider"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//ModelContext"/>
-    <genClasses ecoreClass="metadata.ecore#//Model">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference metadata.ecore#//Model/entityGroups"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Model/sourceModelProvider"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Model/currentModelContext"/>
-      <genOperations ecoreOperation="metadata.ecore#//Model/findIncludeGroup">
-        <genParameters ecoreParameter="metadata.ecore#//Model/findIncludeGroup/groupId"/>
-      </genOperations>
-      <genOperations ecoreOperation="metadata.ecore#//Model/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Model/accept/visitor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//EntityGroup"/>
-    <genClasses ecoreClass="metadata.ecore#//Entity">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/childEntities"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/traits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Entity/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Entity/type"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/includeGroups"/>
-      <genOperations ecoreOperation="metadata.ecore#//Entity/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Entity/accept/visitor"/>
-      </genOperations>
-      <genOperations ecoreOperation="metadata.ecore#//Entity/getModel"/>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//Trait">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Trait/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Trait/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Trait/sourceModelProvider"/>
-      <genOperations ecoreOperation="metadata.ecore#//Trait/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Trait/accept/visitor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//IncludeEntityGroup">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//IncludeEntityGroup/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//IncludeEntityGroup/modelUri"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore
deleted file mode 100644
index dd850dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore
+++ /dev/null
@@ -1,28 +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="traittypes"
-    nsURI="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" nsPrefix="mdt">
-  <eClassifiers xsi:type="ecore:EClass" name="ListOfValues">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2003/XMLType#//SimpleAnyType"
-        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="SetGenerator">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="algorithm" 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="expression" 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>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel
deleted file mode 100644
index 9633b3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel
+++ /dev/null
@@ -1,20 +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.common/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="TraitTypes" importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>metadataTraitTypes.ecore</foreignModel>
-  <genPackages prefix="TraitTypes" basePackage="org.eclipse.jst.jsf.common.metadata.traittypes"
-      resource="XML" disposableProviderFactory="true" classPackageSuffix="internal.impl"
-      utilityPackageSuffix="internal.util" providerPackageSuffix="internal.provider"
-      presentationPackageSuffix="internal.presentation" ecorePackage="metadataTraitTypes.ecore#/">
-    <genClasses ecoreClass="metadataTraitTypes.ecore#//ListOfValues">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadataTraitTypes.ecore#//ListOfValues/entries"/>
-    </genClasses>
-    <genClasses ecoreClass="metadataTraitTypes.ecore#//SetGenerator">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadataTraitTypes.ecore#//SetGenerator/algorithm"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadataTraitTypes.ecore#//SetGenerator/expression"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore
deleted file mode 100644
index 521e76e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore
+++ /dev/null
@@ -1,263 +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="symbol"
-    nsURI="http:///org/eclipse/jst/jsf/context/symbol.ecore" nsPrefix="org.eclipse.jst.jsf.context.symbol">
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanInstanceSymbol" eSuperTypes="#//IInstanceSymbol #//IDescribedInDetail">
-    <eOperations name="getJavaTypeDescriptor" eType="#//IJavaTypeDescriptor2"/>
-    <eOperations name="setJavaTypeDescriptor">
-      <eParameters name="newTypeDescriptor" eType="#//IJavaTypeDescriptor2"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//IBeanPropertySymbol" changeable="false" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-        eType="#//IBeanMethodSymbol" changeable="false" volatile="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanPropertySymbol" eSuperTypes="#//IPropertySymbol #//IDescribedInDetail">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//IJavaTypeDescriptor2"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IInstanceSymbol" eSuperTypes="#//IObjectSymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeResolved" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        changeable="false" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimeSource" eType="#//ERuntimeSource"
-        defaultValueLiteral="TAG_INSTANTIATED_SYMBOL"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IJavaSymbol" eSuperTypes="#//ISymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="javaElement" eType="#//IJavaElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ISymbol" abstract="true" interface="true">
-    <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="ITypeDescriptor" abstract="true">
-    <eOperations name="instanceOf" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="isArray" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="getArrayElement" eType="#//IObjectSymbol"/>
-    <eOperations name="resolveType" eType="#//IType">
-      <eParameters name="resolvedTypeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="calculateSyntheticCall" eType="#//ISymbol">
-      <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="methodArgs" upperBound="-1" eType="#//ValueType"/>
-      <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//IPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        changeable="false" volatile="true" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="superTypeSignatures" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaceTypeSignatures"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignatureDelegate"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-        eType="#//IMethodSymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeParameterSignatures"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="jdtContext" eType="#//IJavaElement"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enumType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="IType" instanceClassName="org.eclipse.jdt.core.IType"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IJavaElement" instanceClassName="org.eclipse.jdt.core.IJavaElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IDescribedInDetail" abstract="true"
-      interface="true"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IJavaTypeDescriptor2" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//IType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="beanProperties" upperBound="-1"
-        eType="#//IBeanPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="beanMethods" upperBound="-1"
-        eType="#//IBeanPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="arrayCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanMethodSymbol" eSuperTypes="#//IDescribedInDetail #//IMethodSymbol">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//IJavaTypeDescriptor2"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IComponentSymbol" eSuperTypes="#//IInstanceSymbol #//IDescribedInDetail"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IPropertySymbol" eSuperTypes="#//IObjectSymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="intermediate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IMapTypeDescriptor" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mapSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="immutable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="ERuntimeSource">
-    <eLiterals name="BUILT_IN_SYMBOL" literal="BUILT_IN_SYMBOL"/>
-    <eLiterals name="MANAGED_BEAN_SYMBOL" value="1"/>
-    <eLiterals name="TAG_INSTANTIATED_SYMBOL" value="2"/>
-    <eLiterals name="OTHER" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IMethodSymbol" eSuperTypes="#//ISymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IObjectSymbol" abstract="true" interface="true"
-      eSuperTypes="#//ISymbol">
-    <eOperations name="supportsCoercion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="coerce" eType="#//ITypeDescriptor">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="call" eType="#//ISymbol">
-      <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="methodArguments" upperBound="-1" eType="#//ValueType"/>
-      <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="typeDescriptor" eType="#//ITypeDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="readable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="writable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedTypeDescriptor" abstract="true"
-      interface="true" eSuperTypes="#//ITypeDescriptor">
-    <eOperations name="isUnboundedForType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getUnboundedProperty" eType="#//ISymbol">
-      <eParameters name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedMapTypeDescriptor" eSuperTypes="#//IMapTypeDescriptor #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedJavaTypeDescriptor" eSuperTypes="#//IJavaTypeDescriptor2 #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IListTypeDescriptor" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="listSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"
-        transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedListTypeDescriptor" eSuperTypes="#//IListTypeDescriptor #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="ValueType" instanceClassName="org.eclipse.jst.jsf.common.internal.types.ValueType"/>
-  <eSubpackages name="symbol" nsURI="http:///org/eclipse/jst/jsf/context/symbol.ecore"
-      nsPrefix="org.eclipse.jst.jsf.context.symbol">
-    <eClassifiers xsi:type="ecore:EDataType" name="ValueType" instanceClassName="org.eclipse.jst.jsf.common.internal.types.ValueType"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedListTypeDescriptor" eSuperTypes="#//symbol/IListTypeDescriptor #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IListTypeDescriptor" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="listSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"
-          transient="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedJavaTypeDescriptor" eSuperTypes="#//symbol/IJavaTypeDescriptor2 #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedMapTypeDescriptor" eSuperTypes="#//symbol/IMapTypeDescriptor #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedTypeDescriptor" abstract="true"
-        interface="true" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eOperations name="getUnboundedProperty" eType="#//symbol/ISymbol">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-      </eOperations>
-      <eOperations name="isUnboundedForType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IObjectSymbol" abstract="true" interface="true"
-        eSuperTypes="#//symbol/ISymbol">
-      <eOperations name="call" eType="#//symbol/ISymbol">
-        <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="methodArguments" upperBound="-1" eType="#//symbol/ValueType"/>
-        <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="coerce" eType="#//symbol/ITypeDescriptor">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="supportsCoercion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="writable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="readable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="typeDescriptor" eType="#//symbol/ITypeDescriptor"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IMethodSymbol" eSuperTypes="#//symbol/ISymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EEnum" name="ERuntimeSource">
-      <eLiterals name="OTHER" value="3"/>
-      <eLiterals name="TAG_INSTANTIATED_SYMBOL" value="2"/>
-      <eLiterals name="MANAGED_BEAN_SYMBOL" value="1"/>
-      <eLiterals name="BUILT_IN_SYMBOL" literal="BUILT_IN_SYMBOL"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IMapTypeDescriptor" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="immutable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-          defaultValueLiteral="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="mapSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"
-          transient="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IPropertySymbol" eSuperTypes="#//symbol/IObjectSymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="intermediate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IComponentSymbol" eSuperTypes="#//symbol/IInstanceSymbol #//symbol/IDescribedInDetail"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanMethodSymbol" eSuperTypes="#//symbol/IDescribedInDetail #//symbol/IMethodSymbol">
-      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//symbol/IJavaTypeDescriptor2"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IJavaTypeDescriptor2" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="arrayCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="beanMethods" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="beanProperties" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//symbol/IType"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IDescribedInDetail" abstract="true"
-        interface="true"/>
-    <eClassifiers xsi:type="ecore:EDataType" name="IJavaElement" instanceClassName="org.eclipse.jdt.core.IJavaElement"/>
-    <eClassifiers xsi:type="ecore:EDataType" name="IType" instanceClassName="org.eclipse.jdt.core.IType"/>
-    <eClassifiers xsi:type="ecore:EClass" name="ITypeDescriptor" abstract="true">
-      <eOperations name="calculateSyntheticCall" eType="#//symbol/ISymbol">
-        <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="methodArgs" upperBound="-1" eType="#//symbol/ValueType"/>
-        <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="resolveType" eType="#//symbol/IType">
-        <eParameters name="resolvedTypeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="getArrayElement" eType="#//symbol/IObjectSymbol"/>
-      <eOperations name="isArray" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eOperations name="instanceOf" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="jdtContext" eType="#//symbol/IJavaElement"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeParameterSignatures"
-          unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          transient="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-          eType="#//symbol/IMethodSymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignatureDelegate"
-          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaceTypeSignatures"
-          upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="superTypeSignatures"
-          upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          changeable="false" volatile="true" defaultValueLiteral=""/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-          eType="#//symbol/IPropertySymbol" volatile="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="ISymbol" abstract="true" interface="true">
-      <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="IJavaSymbol" eSuperTypes="#//symbol/ISymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="javaElement" eType="#//symbol/IJavaElement"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IInstanceSymbol" eSuperTypes="#//symbol/IObjectSymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimeSource" eType="#//symbol/ERuntimeSource"
-          defaultValueLiteral="TAG_INSTANTIATED_SYMBOL"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeResolved" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-          changeable="false" volatile="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanPropertySymbol" eSuperTypes="#//symbol/IPropertySymbol #//symbol/IDescribedInDetail">
-      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//symbol/IJavaTypeDescriptor2"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanInstanceSymbol" eSuperTypes="#//symbol/IInstanceSymbol #//symbol/IDescribedInDetail">
-      <eOperations name="setJavaTypeDescriptor">
-        <eParameters name="newTypeDescriptor" eType="#//symbol/IJavaTypeDescriptor2"/>
-      </eOperations>
-      <eOperations name="getJavaTypeDescriptor" eType="#//symbol/IJavaTypeDescriptor2"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-          eType="#//symbol/IBeanMethodSymbol" changeable="false" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" changeable="false" volatile="true"/>
-    </eClassifiers>
-  </eSubpackages>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel
deleted file mode 100644
index a068a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel
+++ /dev/null
@@ -1,121 +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 2006 Oracle"
-    modelDirectory="/org.eclipse.jst.jsf.common/src" editDirectory="/org.eclipse.jst.jsf.common/src"
-    editorDirectory="/org.eclipse.jst.jsf.context.symbol.editor/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="My" modelPluginClass="" editPluginClass="org.eclipse.jst.jsf.common.JSFCommonPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.context.symbol.presentation.MyEditorPlugin"
-    testSuiteClass="org.eclipse.jst.jsf.context.symbol.tests.MyAllTests" importerID="org.eclipse.emf.importer.java">
-  <foreignModel>@model</foreignModel>
-  <genPackages prefix="Symbol" basePackage="org.eclipse.jst.jsf.context" disposableProviderFactory="true"
-      classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util" providerPackageSuffix="internal.provider"
-      ecorePackage="symbol.ecore#/">
-    <genEnums ecoreEnum="symbol.ecore#//ERuntimeSource">
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/BUILT_IN_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/MANAGED_BEAN_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/TAG_INSTANTIATED_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/OTHER"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="symbol.ecore#//IType"/>
-    <genDataTypes ecoreDataType="symbol.ecore#//IJavaElement"/>
-    <genDataTypes ecoreDataType="symbol.ecore#//ValueType"/>
-    <genClasses ecoreClass="symbol.ecore#//IBeanInstanceSymbol">
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanInstanceSymbol/properties"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanInstanceSymbol/methods"/>
-      <genOperations ecoreOperation="symbol.ecore#//IBeanInstanceSymbol/getJavaTypeDescriptor"/>
-      <genOperations ecoreOperation="symbol.ecore#//IBeanInstanceSymbol/setJavaTypeDescriptor">
-        <genParameters ecoreParameter="symbol.ecore#//IBeanInstanceSymbol/setJavaTypeDescriptor/newTypeDescriptor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBeanPropertySymbol">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanPropertySymbol/owner"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IInstanceSymbol">
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IInstanceSymbol/typeResolved"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IInstanceSymbol/runtimeSource"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IJavaSymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaSymbol/javaElement"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//ISymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ISymbol/name"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//ITypeDescriptor">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//ITypeDescriptor/properties"/>
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeSignature"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/superTypeSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/interfaceTypeSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeSignatureDelegate"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//ITypeDescriptor/methods"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeParameterSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/jdtContext"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/enumType"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/instanceOf">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/instanceOf/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/isArray"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/getArrayElement"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/resolveType">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/resolveType/resolvedTypeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/methodName"/>
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/methodArgs"/>
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/symbolName"/>
-      </genOperations>
-    </genClasses>
-    <genClasses image="false" ecoreClass="symbol.ecore#//IDescribedInDetail"/>
-    <genClasses ecoreClass="symbol.ecore#//IJavaTypeDescriptor2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaTypeDescriptor2/type"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IJavaTypeDescriptor2/beanProperties"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IJavaTypeDescriptor2/beanMethods"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaTypeDescriptor2/arrayCount"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBeanMethodSymbol">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanMethodSymbol/owner"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IComponentSymbol"/>
-    <genClasses ecoreClass="symbol.ecore#//IPropertySymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IPropertySymbol/intermediate"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IMapTypeDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMapTypeDescriptor/mapSource"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMapTypeDescriptor/immutable"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IMethodSymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMethodSymbol/signature"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="symbol.ecore#//IObjectSymbol">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//IObjectSymbol/typeDescriptor"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IObjectSymbol/readable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IObjectSymbol/writable"/>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/supportsCoercion">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/supportsCoercion/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/coerce">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/coerce/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/call">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/methodName"/>
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/methodArguments"/>
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/symbolName"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedTypeDescriptor">
-      <genOperations ecoreOperation="symbol.ecore#//IBoundedTypeDescriptor/isUnboundedForType">
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/isUnboundedForType/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty">
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty/name"/>
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty/typeSignature"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedMapTypeDescriptor"/>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedJavaTypeDescriptor"/>
-    <genClasses ecoreClass="symbol.ecore#//IListTypeDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IListTypeDescriptor/listSource"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedListTypeDescriptor"/>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties
deleted file mode 100644
index c56f413..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties
+++ /dev/null
@@ -1,19 +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 - Common
-plugin.provider=Eclipse.org
-
-###############################################################################
-extension-point.name.0 = annotationFiles
-extension-point.name.1 = JSF EL Symbol Source Provider
-extension-point.name.2 = Contextual Symbol Factory
-extension-point.name.3 = Metadata Domain Loading Strategies (internal)
-extension-point.name.4 = Metadata Domain Source Model Types (internal)
-extension-point.name.5 = Metadata Domain Source Model Type Translators (internal)
-extension-point.name.6 = Standard Metadata Files
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml
deleted file mode 100644
index d34cf40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
- <extension-point id="annotationFiles" name="%extension-point.name.0" schema="schema/annotationFiles.exsd"/>
- <extension-point id="symbolSourceProvider" name="%extension-point.name.1" schema="schema/symbols.exsd"/>
- <extension-point id="contextSymbolFactory" name="%extension-point.name.2" schema="schema/contextSymbolFactory.exsd"/>
- <extension-point id="domainLoadingStrategies" name="%extension-point.name.3" schema="schema/DomainLoadingStrategies.exsd"/>
- <extension-point id="domainSourceModelTypes" name="%extension-point.name.4" schema="schema/DomainSourceModelTypes.exsd"/>
- <extension-point id="domainSourceModelTypeTranslators" name="%extension-point.name.5" schema="schema/DomainSourceModelTypeTranslators.exsd"/>
- <extension-point id="standardMetaDataFiles" name="%extension-point.name.6" schema="schema/StandardMetaDataFiles.exsd"/>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainLoadingStrategies">
-      <domainLoader
-            domainId="TagLibraryDomain"
-            domainLoadingStrategy="org.eclipse.jst.jsf.common.metadata.internal.JSPTagLibDomainLoadingStrategy"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypes">
-      <domainSourceModelTypes
-            domainId="TagLibraryDomain"
-            domainSourceModelTypeId="DefaultMetaDataTagLibraryHandler"
-            locator="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator"
-            ordinal="10">
-      </domainSourceModelTypes>   
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-      <domainSourceModelTypeTranslator
-            domainSourceModelTypeId="DefaultMetaDataTagLibraryHandler"
-            translatorClass="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator">
-      </domainSourceModelTypeTranslator>
-   </extension>
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http:///org/eclipse/jst/jsf/context/symbol.ecore" 
-       class = "org.eclipse.jst.jsf.context.symbol.SymbolPackage"
-       genModel = "model/symbol.genmodel" /> 
-	<package 
-       uri = "http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-       class = "org.eclipse.jst.jsf.common.metadata.MetadataPackage"
-       genModel = "model/metadata.genmodel" />        
-	<package 
-       uri = "http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-       class = "org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage"
-       genModel = "model/metadataTraitTypes.genmodel" />
-  </extension>
-  <extension
-        point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-        <factory 
-       uri = "http:///org/eclipse/jst/jsf/context/symbol.ecore" 
-       class = "org.eclipse.jst.jsf.context.symbol.internal.provider.SymbolItemProviderAdapterFactory" 
-       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.context.symbol.provider.IContentProposalProvider" />
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.common.contextSymbolFactory">
-     <contextSymbolFactory
-           factory="org.eclipse.jst.jsf.context.symbol.internal.source.UnknownTypeContextSymbolFactory"
-           factoryId="org.eclipse.jst.jsf.common.unknownTypeSymbolFactory">
-     </contextSymbolFactory>
-  </extension>
- 
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd
deleted file mode 100644
index a2b609d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="DomainLoadingStrategies" name="DomainLoadingStrategies"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Allows for naming domains of metadata and binding to classes that can load sources of metadata into that domain.   A domain is a set of entities using jsf.common.metadata model.  In initial release, Tag Library domain will be supplied.  Tag files, Tags, attributes are the known entities on this domain, as an example.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainLoader"/>
-         </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="domainLoader">
-      <complexType>
-         <attribute name="domainId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Key used to name this domain.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="domainLoadingStrategy" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified java class implementing &lt;code&gt;org.eclipse.jst.jsf.common.metadata.IDomainLoadingStrategy&lt;/code&gt; that will be used to load an instance of a metadata model.
-
-Implementing class requires a constructor taking the domainID String.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy"/>
-               </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>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.domainLoadingStrategies&quot;&gt;
-      &lt;domainLoader
-            domainId=&quot;TagLibraryDomain&quot;
-         domainLoadingStrategy=&quot;org.eclipse.jst.jsf.common.metadata.internal.JSPTagLibDomainLoadingStrategy&quot;/&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 2007 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.common/schema/DomainSourceModelTypeTranslators.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypeTranslators.exsd
deleted file mode 100644
index 1d9c020..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypeTranslators.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="DomainSourceModelTypeTranslators" name="DomainSourceModelTypeTranslators"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Allows for metadata domain translators to be applied to a metadata domain source type.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainSourceModelTypeTranslator"/>
-         </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="domainSourceModelTypeTranslator">
-      <complexType>
-         <attribute name="domainSourceModelTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id from the domainSourceModelTypes ext-pt that will bind the translator class to that domain source.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="translatorClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified class implementing &lt;code&gt;org.eclipse.jst.jsf.common.metadata.IMetaDataTranslator&lt;/code&gt; that will translate from the source domain to the &quot;standard&quot; domain of entities and traits.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator"/>
-               </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>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators&quot;&gt;
-      &lt;domainSourceModelTypeTranslator
-            class=&quot;org.eclipse.jst.jsf.common.metadata.internal.TaglibMetaDataTLDTranslator&quot;
-            domainSourceModelTypeId=&quot;TagLibMetaDataTagLibraryHandler&quot;&gt;
-      &lt;/domainSourceModelTypeTranslator&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 2007 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.common/schema/DomainSourceModelTypes.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypes.exsd
deleted file mode 100644
index 4bb747e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypes.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.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="domainSourceModelTypes" name="Metadata Domain Source Model Types"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Binds metadata source types to a particular domain of metadata.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainSourceModelTypes"/>
-         </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="domainSourceModelTypes">
-      <complexType>
-         <attribute name="domainSourceModelTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Uniquely identifies this combination of domain and source metadata locator.  This id should be used by the domainSourceModelTypeTranslator ext-pt.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="domainId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The DomainLoadingStrategy domainId that this source is being bound to.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A class implementing &lt;code&gt;IMetaDataLocator&lt;/code&gt; that is responsible for finding instances of metadata.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="ordinal" type="string">
-            <annotation>
-               <documentation>
-                  An optional integer ordinal that is used to prioritize a source if the domain loading strategy does not supply it&apos;s own sorting.  The higher the number, the higher the priority.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </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 2007 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.common/schema/StandardMetaDataFiles.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/StandardMetaDataFiles.exsd
deleted file mode 100644
index 1ab7d63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/StandardMetaDataFiles.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="StandardMetaDataFiles" name="StandardMetaDataFiles"/>
-      </appInfo>
-      <documentation>
-         Defines a file of metadata for a given URI in &quot;standard&quot; form loadable by &lt;code&gt;org.eclipse.jst.jsf.common.metadata model&lt;/code&gt;
-
-&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="standardMetaDataFile" 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="standardMetaDataFile">
-      <annotation>
-         <documentation>
-            Mapping of a namespace URI to an XML file loadable by a standard metadata EMF model defined by &lt;code&gt;http://org.eclipse.jst.jsf.common.metadata/metadata.ecore&lt;/code&gt;.     See &lt;code&gt;org.eclipse.jst.jsf.standard.tagsupport&lt;/code&gt; plugin and the /metadata/jsf_core.xml file.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content model URI being annotated.  eg.  &quot;http://java.sun.com/jsf/core&quot;.   This can, of course, be any string that the consumer wishes to use as a key.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="location" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Location of the annotation file.   If no locator is provided, it will use the default &lt;code&gt;PluginRelativeStandardMetaDataSourceFileLocator&lt;/code&gt; which will find the file in a location relative to the plugin.
-eg. /metadata/jsf_core.xml
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string">
-            <annotation>
-               <documentation>
-                  Class extending &lt;code&gt;org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataSourceFileLocator&lt;/code&gt; that will be used to locate the standard metadata file.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataSourceFileLocator"/>
-               </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>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.standardMetaDataFiles&quot;&gt;
-      &lt;standardMetaDataFile
-            location=&quot;/metadata/JSF_HTML.xml&quot;
-            uri=&quot;http://java.sun.com/jsf/html&quot;&gt;
-      &lt;/standardMetaDataFile&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 2007 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.common/schema/annotationFiles.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/annotationFiles.exsd
deleted file mode 100644
index 4db4fe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/annotationFiles.exsd
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="annotationFiles" name="Annotation Files"/>
-      </appInfo>
-      <documentation>
-         Adds annotation meta-data to a content model.  An extending plugin may only create one annotation file for a given URI.
-
-&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="annotationFile" 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="annotationFile">
-      <annotation>
-         <documentation>
-            File used to map annotations to a tag library content model.  The file assigns properties to a tag element or attribute.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content model URI being annotated.  eg.  &quot;http://java.sun.com/jsf/core&quot;.   This can, of course, be any string that the consumer wishes to use as a key.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="location" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Location of the annotation file.   If no locator is provided, it will use the default &lt;code&gt;CMPluginRelativeSourceFileLocator&lt;/code&gt; which will find the file in a location relative to the plugin.
-eg. /metadata/jsf_core.xml
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string">
-            <annotation>
-               <documentation>
-                  Class implementing the abstract &lt;code&gt;CMAnnotationSourceFileLocator&lt;/code&gt; class.  Responsible for locating the annotation file and returning an InputStream to the parser and returning a &lt;code&gt;ResourceBundle&lt;/code&gt; if there is one.   If a locator is not supplied, the default implementation for a plugin relative file, &lt;code&gt;CMPluginRelativeSourceFileLocator&lt;/code&gt; will be used.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator:org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="parser" type="string">
-            <annotation>
-               <documentation>
-                  The name of the parser class used to fill the internal model.  If not specified the default, &lt;code&gt;CMAnnotationFileParser&lt;/code&gt;, will be used which conforms to the default schema &lt;code&gt;http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema&lt;/code&gt;.   If parser is provided, it must implement &lt;code&gt;ICMAnnotationFileParser&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator:org.eclipse.jst.jsf.contentmodel.annotations.ICMAnnotationFileParser"/>
-               </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>
-         The parser, if specified, must implement &lt;code&gt;ICMAnnotationFileParser&lt;/code&gt; to create &lt;code&gt;CMElementAnnotation&lt;/code&gt; and &lt;code&gt;CMAttributeAnnotations&lt;/code&gt; in the &lt;code&gt;CMAnnotationMap&lt;/code&gt;.
-      </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.common/schema/contextSymbolFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/contextSymbolFactory.exsd
deleted file mode 100644
index b44040c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/contextSymbolFactory.exsd
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="contextSymbolFactory" name="Contextual Symbol Factory"/>
-      </appInfo>
-      <documentation>
-         The context symbol factory allows a symbol factory with a specific id to be registered to create symbols in a particular context.  Clients wishing to delegate symbol construction in a particular context may then request the symbol factory based on its id.
-
-To get a map of registered symbol factories keyed by id, call SymbolsPlugin.getSymbolFactories().
-
-The most common use of this extension point is by the JSPModelProcessor.  By decorating a tag attribute with meta-data pointing to a context symbol factory with a particular id, the JSP model processor will call that symbol factory to create a symbol for that tag.
-
-See developer docs on decorating variable contributing tags for more information.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="contextSymbolFactory"/>
-         </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="contextSymbolFactory">
-      <annotation>
-         <documentation>
-            The context symbol factory description.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="factory" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An instance of AbstractContextSymbolFactory that implements the context symbol factory.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="factoryId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id that will be used to uniquely identify this factory in meta-data or elsewhere.
-               </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 creates a symbol factory for creating symbols.&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension
-     point=&quot;org.eclipse.jst.jsf.context.symbol.contextSymbolFactory&quot;&gt;
-   &lt;contextSymbolFactory
-         factory=&quot;org.eclipse.jst.jsf.designtime.internal.jsp.JSPDefaultSymbolFactory&quot;
-         factoryId=&quot;org.eclipse.jst.jsf.designtime.core.loadBundle&quot;/&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;When the symbol factory &lt;i&gt;org.eclipse.jst.jsf.designtime.core.loadBundle&lt;/i&gt; is requested, an instance of JSPDefaultSymbolFactory will be constructed.&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.common/schema/grammar-annotations.xsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/grammar-annotations.xsd
deleted file mode 100644
index 2319744..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/grammar-annotations.xsd
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsd:schema
-	targetNamespace="http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema" 
-	version="1.0"
-	attributeFormDefault="unqualified"
-	elementFormDefault="unqualified" 
-	xmlns="http://org.eclipse.jst.jsf.contentmodel.annotations/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="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
-		</xsd:sequence>		
-		<xsd:attribute name="name" type="xsd:string" use="required"/>		
-	</xsd:complexType>
-</xsd:schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.exsd
deleted file mode 100644
index 8f265a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.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.common" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="symbols" name="Symbol Source Provider"/>
-      </appinfo>
-      <documentation>
-         A symbol source provider is called to discover EL namespace variable symbols.  For example, managed bean variable symbols, are contributed through a symbol source provider.  A symbol source provider may or may not wish to use a context symbol factory depending on the situation.
-
-When an EL variable is resolved, each symbol provider will be considered equally.  All of the information that determines a symbol&apos;s characteristics must be encoded in the returned ISymbol object.
-
-A list of registered symbol providers may be found by calling JSFCommonPlugin.getSymbolSourceProvider().
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="symbolSourceId"/>
-         </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="symbolSourceId">
-      <complexType>
-         <attribute name="factory" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An instance of the factory interface that will be invoked to create an instance of this symbol source provider.  Factory must have a zero-arg default constructor.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory"/>
-               </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 xml is used to contribute a set of default providers to contribute managed bean, built-in and tag contributed variables:
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.context.symbol.symbolSourceProvider&quot;&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.DefaultBeanSymbolSourceProvider&quot;/&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.JSPTagVariableSymbolSourceProvider&quot;/&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.DefaultBuiltInSymbolProvider&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.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java
deleted file mode 100644
index 83e0407..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java
+++ /dev/null
@@ -1,332 +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;
-
-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.eclipse.core.runtime.IExtension;
-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.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * This is the central singleton for the My edit plugin.
- * <!-- begin-user-doc -->
- * This class is not API.
- * <!-- end-user-doc -->
- * @generated
- */
-public final class JSFCommonPlugin extends EMFPlugin {
-
-	/**
-	 * Plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.common"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    private static List<ISymbolSourceProviderFactory>  registeredSymbolSourceProviders;
-    private static Map<String,AbstractContextSymbolFactory>   registeredSymbolFactories;
-    
-    private final static String     FACTORY_ATTRIBUTE_NAME = "factory"; //$NON-NLS-1$
-    private final static String     FACTORY_ATTRIBUTE_ID_NAME = "factoryId";  //$NON-NLS-1$
-    private final static String     SYMBOL_SOURCE_ID = "symbolSourceId";  //$NON-NLS-1$
-    private final static String     CONTEXT_SYMBOL_FACTORY =  "contextSymbolFactory"; //$NON-NLS-1$
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final JSFCommonPlugin INSTANCE = new JSFCommonPlugin();
-
-	/**
-	 * 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 JSFCommonPlugin() {
-		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;
-	}
-
-    /**
-     * @param e
-     * @param msg
-     */
-    public static void log(final Exception e, final String msg) {
-        final ILog log = getPlugin().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(int severity, String message, Throwable ex) {
-        getPlugin().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);
-    }
-    /**
-     * @return all registered symbol source providers
-     */
-    public static ISymbolSourceProvider[]  getSymbolSourceProvider()
-    {
-        return registeredSymbolSourceProviders.toArray(new ISymbolSourceProvider[0]);
-    }
-    
-    /**
-     * @return all registered symbol source providers
-     */
-    public synchronized static List<ISymbolSourceProviderFactory> getSymbolSourceProviders()
-    {
-        if (registeredSymbolSourceProviders == null)
-        {
-            registerProviders();
-            if (registeredSymbolSourceProviders == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableList(registeredSymbolSourceProviders);
-    }
-    
-    private static void registerProviders()
-    {
-        final IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(plugin.getBundle().getSymbolicName(), Implementation.SYMBOL_SOURCE_EXT_ID);
-        final IExtension[] extensions = point.getExtensions();
-        registeredSymbolSourceProviders = new ArrayList<ISymbolSourceProviderFactory>(extensions.length);
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            final IExtension extension = extensions[i];
-            final IConfigurationElement[] elements = 
-                extension.getConfigurationElements();
-            final String bundleId = extension.getContributor().getName();
-            
-            for (int j = 0; j < elements.length; j++)
-            {
-                final IConfigurationElement element = elements[j];
-                if (SYMBOL_SOURCE_ID.equals(element.getName())
-                        && element.getAttribute(FACTORY_ATTRIBUTE_NAME) != null)
-                {
-                    String factoryClassName = element.getAttribute(FACTORY_ATTRIBUTE_NAME);
-                    final Bundle bundle = Platform.getBundle(bundleId);
-                    
-                    if (bundle != null)
-                    {
-                        try
-                        {
-                            Class factoryClass = bundle.loadClass(factoryClassName);
-                            
-                            ISymbolSourceProviderFactory factory = 
-                                (ISymbolSourceProviderFactory) factoryClass.newInstance();
-
-                            registeredSymbolSourceProviders.add(factory);
-                        }
-                        catch (Exception e)
-                        {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol provider extension point",e)); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @return the list of registed symbol factories
-     */
-    public synchronized static Map<String, AbstractContextSymbolFactory> getSymbolFactories()
-    {
-        if (registeredSymbolFactories == null)
-        {
-            registerSymbolFactories();
-            if (registeredSymbolFactories == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(registeredSymbolFactories);
-    }
-    
-    private static void registerSymbolFactories()
-    {
-        final IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(plugin.getBundle().getSymbolicName(), Implementation.SYMBOL_FACTORY_EXT_ID);
-        final IExtension[] extensions = point.getExtensions();
-        registeredSymbolFactories = new HashMap<String, AbstractContextSymbolFactory>(extensions.length);
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            final IExtension extension = extensions[i];
-            final IConfigurationElement[] elements = 
-                extension.getConfigurationElements();
-            final String bundleId = extension.getContributor().getName();
-            
-            for (int j = 0; j < elements.length; j++)
-            {
-                final IConfigurationElement element = elements[j];
-                if (CONTEXT_SYMBOL_FACTORY.equals(element.getName())
-                        && element.getAttribute(FACTORY_ATTRIBUTE_NAME) != null)
-                {
-                    final String factoryClassName = element.getAttribute(FACTORY_ATTRIBUTE_NAME);
-                    final String factoryId = element.getAttribute(FACTORY_ATTRIBUTE_ID_NAME);
-                    final Bundle bundle = Platform.getBundle(bundleId);
-                    
-                    if (bundle != null)
-                    {
-                        try {
-                            Class factoryClass = bundle.loadClass(factoryClassName);
-                        
-                            AbstractContextSymbolFactory factory = 
-                                (AbstractContextSymbolFactory) factoryClass.newInstance();
-                            registeredSymbolFactories.put(factoryId, factory);
-                        } catch (InstantiationException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        } catch (IllegalAccessException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        } catch (ClassNotFoundException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * Logs an exception in this plugin to the error log
-     * 
-     * @param t
-     */
-    public static void log(Throwable t)
-    {
-        ILog log = getPlugin().getLog();
-        IStatus status = new Status(IStatus.ERROR, getPlugin().getSymbolicName(), 0,  "Caught exception", t); //$NON-NLS-1$
-        log.log(status);
-    }
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static class Implementation extends EclipsePlugin 
-    {
-        /**
-         * Name of the symbolSourceProvider ext point
-         */
-        public static final  String   SYMBOL_SOURCE_EXT_ID = "symbolSourceProvider"; //$NON-NLS-1$
-        /**
-         * Local identifier for the symbol factory extension point
-         */
-        public static final  String   SYMBOL_FACTORY_EXT_ID = "contextSymbolFactory"; //$NON-NLS-1$
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-    
-	
-	/**
-	 * Utility method returning class from class name using classloader from specified bundle
-	 * @param className
-	 * @param bundleId
-	 * @return Class
-	 */
-	public static Class<?> loadClass(String className, String bundleId) {
-		Class<?> aClass = null;
-		try {
-			if (bundleId != null){
-				Bundle bundle = Platform.getBundle(bundleId);
-				if (bundle != null){
-					aClass = bundle.loadClass(className);
-				}
-			}
-		} catch (ClassNotFoundException e) {
-			log(e);
-		}
-		return aClass;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttrDOMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttrDOMAdapter.java
deleted file mode 100644
index ec51032..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttrDOMAdapter.java
+++ /dev/null
@@ -1,92 +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.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * Generic adapter for DOM attribute structures.
- * 
- * @author cbateman
- * 
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- */
-public abstract class AttrDOMAdapter extends DOMAdapter
-{
-
-    private AttributeIdentifier     _attributeId; // lazily instantiated.
-    private final ElementDOMAdapter _owner;
-
-    /**
-     * @param owner
-     */
-    protected AttrDOMAdapter(final ElementDOMAdapter owner)
-    {
-        _owner = owner;
-    }
-
-    /**
-     * The default implementation always returns the owner specified in the
-     * constructor.
-     * 
-     * @return the element that owns this attribute
-     */
-    public ElementDOMAdapter getOwningElement()
-    {
-        return _owner;
-    }
-
-    /**
-     * @return the value of the attribute. May return null if the attribute has
-     *         no value.
-     */
-    public abstract String getValue();
-
-    @Override
-    public final short getNodeType()
-    {
-        return Node.ATTRIBUTE_NODE;
-    }
-
-    /**
-     * @return the attribute identifier
-     */
-    public final AttributeIdentifier getAttributeIdentifier()
-    {
-        synchronized (this)
-        {
-            if (_attributeId == null)
-            {
-                _attributeId = new MyAttributeIdentifier();
-            }
-        }
-        return _attributeId;
-    }
-
-    private class MyAttributeIdentifier extends AttributeIdentifier
-    {
-
-        @Override
-        public String getName()
-        {
-            return AttrDOMAdapter.this.getLocalName();
-        }
-
-        @Override
-        public TagIdentifier getTagIdentifier()
-        {
-            return getOwningElement().getTagId();
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttributeIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttributeIdentifier.java
deleted file mode 100644
index 2bf163e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/AttributeIdentifier.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.dom;
-
-/**
- * Uniquely identifies a named attribute on a tag usint TagIdentifier as a way
- * to uniquely identify the host tag.  All instances should be considered 
- * immutable and idempotent.  Factories may cache copies as transparent 
- * singletons for unique TagIdentifier/attribute.
- * 
- * THIS CLASS IS NOT API AND SHOULD NOT BE USED
- * 
- * @author cbateman
- *
- */
-public abstract class AttributeIdentifier
-{
-    /**
-     * @return the attribute name (local name, namespace prefix is currently ignored)
-     */
-    public abstract String getName();
-    
-    /**
-     * @return the tag identifier
-     */
-    public abstract TagIdentifier getTagIdentifier();
-    
-    public final boolean equals(Object compareTo)
-    {
-        if (compareTo instanceof AttributeIdentifier)
-        {
-            return isSameAttributeType((AttributeIdentifier) compareTo);
-        }
-        return false;
-    }
-    
-    public final int hashCode()
-    {
-        // use toLowerCase to ensure equals matches
-        int hashCode = getName().toLowerCase().hashCode();
-        
-        int tagCode = getTagIdentifier().hashCode();
-       
-        hashCode = hashCode ^ tagCode;
-        
-        return hashCode;
-    }
-
-    /**
-     * @param attributeId
-     * @return true if attributeId represents the same attribute as this.
-     */
-    public final boolean isSameAttributeType(AttributeIdentifier attributeId)
-    {
-        // if same object, always true
-        if (attributeId == this)
-        {
-            return true;
-        }
-        
-
-        // if tag identifiers not same, then always false.
-        if (!getTagIdentifier().isSameTagType(attributeId.getTagIdentifier()))
-        {
-            return false;
-        }
-
-        // if tag id is the same, the tag name must be too.
-        return getName().toLowerCase().equals(attributeId.getName().toLowerCase());
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/DOMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/DOMAdapter.java
deleted file mode 100644
index fb3c43b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/DOMAdapter.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.common.dom;
-
-/**
- * A generic adapter that can adapt some non-DOM
- * things to a dom-like structure like an IRegion to a DOM-like structure.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class DOMAdapter
-{
-    /**
-     * @return the node type.  Conforms to Node.getNodeType.
-     */
-    public abstract short getNodeType();
-    
-    /**
-     * @return the name prefix.  Conforms to W3C Node.getPrefix()
-     */
-    public abstract String getPrefix();
-    
-    /**
-     * @return the local part of the name.  Conforms to W3C Node.getLocalName()
-     */
-    public abstract String getLocalName();
-    
-    /**
-     * @return the name of the node.  Conforms the W3C Node.getNodeName interface
-     */
-    public abstract String getNodeName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/ElementDOMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/ElementDOMAdapter.java
deleted file mode 100644
index b30f3cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/ElementDOMAdapter.java
+++ /dev/null
@@ -1,84 +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.dom;
-
-import java.util.Map;
-
-import org.w3c.dom.Node;
-
-/**
- * T
- * @author cbateman
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public abstract class ElementDOMAdapter extends DOMAdapter
-{
-    private TagIdentifier       _tagIdentifier; // lazily initialized
-    
-    /**
-     * Map should be considered immutable and may throw exceptions if
-     * mutations are attempted.
-     * 
-     * @return a nodeName keyed map of attributes belonging to this element
-     */
-    public abstract Map<String, ? extends AttrDOMAdapter> getAttributes();
-
-    @Override
-    public final short getNodeType()
-    {
-        return  Node.ELEMENT_NODE;
-    }
-
-    /**
-     * @return the namespace uri for element or null if not applicable (i.e. HTML).
-     */
-    public abstract String getNamespace();
-    
-    /**
-     * @return the tag identifier for this attribute
-     */
-    public final TagIdentifier getTagId()
-    {
-        synchronized(this)
-        {
-            if (_tagIdentifier == null)
-            {
-                _tagIdentifier = new MyTagIdentifier();
-            }
-        }
-        return _tagIdentifier; 
-    }
-    
-    private final class MyTagIdentifier extends TagIdentifier
-    {
-        @Override
-        public String getTagName()
-        {
-            return getLocalName();
-        }
-
-        @Override
-        public String getUri()
-        {
-            return getNamespace();
-        }
-
-        @Override
-        public boolean isJSPTag()
-        {
-            // shouldn't be called
-            throw new UnsupportedOperationException("jsp flag not supported on this identifier");
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
deleted file mode 100644
index 3d675a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.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.common.dom;
-
-import javax.xml.namespace.QName;
-
-
-/**
- * Creates an abstraction for a tag.  A tag is defined as a DOM Element whose
- * namespace uri may be defined outside of the DOM, such as in a JSP tag library
- * declaration.  This allows tags to be abstracted from actual DOM elements, which
- * is useful in situations like palette creation drops where the construction information
- * is known, but we are not ready to create and add a node to the document yet.
- * 
- * All tag TagIdentifier<i>s</i> should be considered immutable and idempotent.  
- * TagIdentifier instances may be cached by the factory.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class TagIdentifier 
-{
-    /**
-     * @return the uri that uniquely identifies the tag.  
-     * 
-     * i.e.
-     * 
-     * If the tag is defined by an XML namespace, then that uri string will be returned.
-     * If the tag is defined by a JSP tag library, then the tag library uri should
-     * be returned.
-     */
-    public abstract String getUri();
-    
-    /**
-     * @return the local name of the tag (without namespace prefix)
-     */
-    public abstract String getTagName();
-    
-    /**
-     * @return true if this tag is a JSP tag
-     */
-    public abstract boolean isJSPTag();
-
-    public final boolean equals(Object compareTo)
-    {
-        if (compareTo instanceof TagIdentifier)
-        {
-            return isSameTagType((TagIdentifier) compareTo);
-        }
-        return false;
-    }
-    
-    public final int hashCode()
-    {
-        // use toLowerCase to ensure equals matches
-        int hashCode = getTagName().toLowerCase().hashCode();
-        
-        String uri = getUri();
-        if (uri != null)
-        {
-            hashCode ^= uri.hashCode();
-        }
-        return hashCode;
-    }
-    
-    /**
-     * @param tagWrapper
-     * @return true if tagWrapper represents the same tag as this.
-     */
-    public final boolean isSameTagType(TagIdentifier tagWrapper)
-    {
-        if (tagWrapper == this)
-        {
-            return true;
-        }
-        
-        final String uri = tagWrapper.getUri();
-        
-        if (uri == null)
-        {
-            if (getUri() != null)
-            {
-                return false;
-            }
-        }
-        else if (uri.equals(getUri()))
-        {
-            final String tagName = tagWrapper.getTagName();
-            
-            if (tagName == null)
-            {
-                if(getTagName() != null)
-                {
-                    return false;
-                }
-            }
-            else
-            {
-                // uri and tag name must both the same for it to be the same type
-                // TODO: the ignore case thing is dependent on the type of container document
-                // Use toLower instead of equalsIgnoreCase to ensure that hashCode generates
-                // a hashCode that guarantees x.equals(y) => x.hashCode == y.hashCode
-                if (tagName.toLowerCase().equals((getTagName().toLowerCase())))
-                {
-                    return true;
-                }
-            }
-        }
-
-        // fall-through, not same
-        return false;
-    }
-    
-    /**
-     * @return the QName equivalent.  Returns a new object on every invocation.
-     */
-    public final QName asQName()
-    {
-        return new QName(getUri(), getTagName());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/package-info.java
deleted file mode 100644
index af4d45a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/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
- *    
- ********************************************************************************/
-
-/**
- * API for manipulating DOM-based objects.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.dom;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
deleted file mode 100644
index 259d909..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.internal;
-
-/**
- * An injection interface that allows classes to selectively report test progress.
- * 
- * @author cbateman
- *
- */
-public interface ITestTracker 
-{
-    /**
-     * Event types
-     *
-     */
-    public enum Event
-    {
-        /**
-         * Signals that tracking should begin on the eventLabel
-         * The seqId must be repeated on the STOP_TRACKING event
-         * for the same event.
-         */
-        START_TRACKING,
-        /**
-         * Signals that tracking should stop on the named event
-         * for the seqId that was passed first in the START_TRACKING.
-         * 
-         */
-        STOP_TRACKING
-    }
-    
-    /**
-     * Fires the event of type event, a unique instance tracking seqId
-     * and a label called eventLabel.
-     * 
-     * @param event
-     * @param seqId
-     * @param eventLabel
-     */
-    void fireEvent(Event event, long seqId, String eventLabel);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java
deleted file mode 100644
index 37e7a99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java
+++ /dev/null
@@ -1,97 +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.internal;
-
-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;
-
-/**
- * Utility JSP methods
- * @author cbateman
- *
- */
-public final class JSPUtil 
-{
-    private final static String  CTYPE_JSPSOURCE = 
-        "org.eclipse.jst.jsp.core.jspsource"; //$NON-NLS-1$
-    private final static String  CTYPE_JSPFRAGMENTSOURCE = 
-        "org.eclipse.jst.jsp.core.jspfragmentsource"; //$NON-NLS-1$
-    /**
-     * @param contentType
-     * @return true if contentType is one of the content types registered
-     * for JSP files
-     */
-    public static boolean isJSPContentType(final String contentType)
-    {
-        return CTYPE_JSPSOURCE.equals(contentType)
-                    || CTYPE_JSPFRAGMENTSOURCE.equals(contentType);
-    }
-    
-    /**
-     * @param file
-     * @return true if file is associated with a JSP or JSP fragment content type
-     */
-    public static boolean isJSPContentType(final IFile file)
-    {
-    	final boolean isJSPSource = isJSPSource(file);
-        if (isJSPSource)
-        {
-            return true;
-        }
-
-        final boolean isJSPFragment = isJSPFragment(file);
-        
-        if  (isJSPFragment)
-        {
-        	return true;
-        }
-        
-        return false;
-    }
-    
-    private JSPUtil()
-    {
-        // no instantiation
-    }
-
-	/**
-	 * @param file
-	 * @return true if file is associated with the JSP source content type
-	 * (returns if JSP fragment)
-	 */
-	public static boolean isJSPSource(IFile file) {
-		return isAssociatedWithContentType(file, CTYPE_JSPSOURCE);
-	}
-
-	/**
-	 * @param file
-	 * @return true if the file is associated with the JSP fragment content type
-	 */
-	public static boolean isJSPFragment(IFile file) {
-		return isAssociatedWithContentType(file, CTYPE_JSPFRAGMENTSOURCE);
-	}
-	
-	private static boolean isAssociatedWithContentType(final IFile file, final String contentType)
-	{
-        final IContentTypeManager typeManager = Platform.getContentTypeManager();
-        IContentType jspContentType = 
-            typeManager.getContentType(contentType);
-        if (jspContentType != null
-                && jspContentType.isAssociatedWith(file.getName()))
-        {
-            return true;
-        }
-      
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/RunOnCompletionPattern.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/RunOnCompletionPattern.java
deleted file mode 100644
index ab216e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/RunOnCompletionPattern.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.internal;
-
-import org.eclipse.core.runtime.IStatus;
-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.common.JSFCommonPlugin;
-
-/**
- * A pattern that runs a Job and either joins on the job's completion
- * or runs some completion behaviour.
- * 
- * @author cbateman
- *
- */
-public class RunOnCompletionPattern implements Runnable
-{
-    private final Job  _job;
-    private final Runnable _runAfter;
-    
-    /**
-     * @param job
-     * @param runAfter
-     */
-    public RunOnCompletionPattern(Job  job, Runnable runAfter)
-    {
-        _job = job;
-        _runAfter = runAfter;
-    }
-
-    public void run()
-    {
-        if (_runAfter != null)
-        {
-            _job.addJobChangeListener(new JobChangeAdapter()
-            {
-
-                @Override
-                public void done(IJobChangeEvent event)
-                {
-                    if (event.getResult().getSeverity() != IStatus.ERROR)
-                    {
-                        _runAfter.run();
-                    }
-                }
-                
-            });
-        }
-
-        _job.schedule();
-        
-        if (_runAfter == null)
-        {
-            try
-            {
-                _job.join();
-            }
-            catch (InterruptedException e)
-            {
-                JSFCommonPlugin.log(e, "Joining on job");
-            }
-        }
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java
deleted file mode 100644
index faa337a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java
+++ /dev/null
@@ -1,34 +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.internal.managedobject;
-
-/**
- * Sub-class for managed objects.
- *
- */
-public abstract class AbstractManagedObject implements IManagedObject 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#dispose()
-     */
-    public abstract void dispose();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#checkpoint()
-     */
-    public abstract void checkpoint();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#destroy()
-     */
-    public abstract void destroy();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java
deleted file mode 100644
index b4e7e75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.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.common.internal.managedobject;
-
-/**
- * Represents an object that wishes to be managed by the framework.
- * 
- * Clients should not implement: sub-class AbstractManagedObject instead.
- *
- */
-public interface IManagedObject 
-{
-    /**
-     * Called by the object client to indicate is finished with the object. 
-     * The object should save any data it may want between sessions, perhaps
-     * by calling its checkpoint, before cleaning held resources and clearing
-     * memory references.
-     */
-    void dispose();
-    
-    /**
-     * Called to indicate that the object should remove all its data from both
-     * memory and persistent storage.  This differentiates it from dispose in
-     * that it signals that this object and its associated state will never
-     * again be loaded for associated objects.
-     */
-    void destroy();
-    
-    /**
-     * Indicates that an object should flush cached data and make durable
-     * any data it might want between sessions.  It does not indicate a 
-     * disposal of the object.
-     */
-    void checkpoint();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java
deleted file mode 100644
index f98fe9d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.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.common.internal.managedobject;
-
-/**
- * An abstraction for a manager that manages managed objects based on a KEYTYPE
- * 
- * @author cbateman
- *
- * @param <T>
- * @param <KEYTYPE> 
- */
-public abstract class ObjectManager<T extends IManagedObject, KEYTYPE>
-{
-    /**
-     * A valid instance of T for the key.  The instance of T may be unique on
-     * a per-key basis or may not.
-     *  
-     * @param key
-     * @return an instance of the managed object associated with key
-     * @throws ManagedObjectException if an error occurs during construction
-     */
-    public abstract T getInstance(KEYTYPE key) throws ManagedObjectException;
-
-    /**
-     * Indicates a problem that occurred during a managed object operation
-     * @author cbateman
-     *
-     */
-    public static class ManagedObjectException extends Exception
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -8723548990029368844L;
-
-        /**
-         * 
-         */
-        public ManagedObjectException()
-        {
-            super();
-        }
-
-        /**
-         * @param message
-         * @param cause
-         */
-        public ManagedObjectException(String message, Throwable cause)
-        {
-            super(message, cause);
-        }
-
-        /**
-         * @param message
-         */
-        public ManagedObjectException(String message)
-        {
-            super(message);
-        }
-
-        /**
-         * @param cause
-         */
-        public ManagedObjectException(Throwable cause)
-        {
-            super(cause);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/CanonicallyOrderedIteratorPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/CanonicallyOrderedIteratorPolicy.java
deleted file mode 100644
index 24ba27d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/CanonicallyOrderedIteratorPolicy.java
+++ /dev/null
@@ -1,64 +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.internal.policy;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An iterator policy that sorts a comparable iterator type canonically.  This
- * policy takes a private copy of the collectin passed in getIterator.  The
- * cost of the sort is incurred when getIterator() is called under the 
- * assumption that the iterator will normally be used immediately after 
- * construction, so there is little value in deferring.
- * 
- * @author cbateman
- *
- * @param <ITERATORTYPE>
- */
-public class CanonicallyOrderedIteratorPolicy<ITERATORTYPE extends Comparable<ITERATORTYPE>> 
-        implements IIteratorPolicy<ITERATORTYPE>
-{
-
-    public Iterator<ITERATORTYPE> getIterator(
-            Collection<ITERATORTYPE> forCollection)
-    {
-        return new CanonicalIterator<ITERATORTYPE>(forCollection);
-    }
-
-    private final static class CanonicalIterator<ITERATORTYPE extends Comparable> implements Iterator<ITERATORTYPE>
-    {
-        private final Iterator<ITERATORTYPE>      _sortedIterator;
-        private CanonicalIterator(final Collection<ITERATORTYPE> source)
-        {
-            List<ITERATORTYPE>  sortable = new ArrayList<ITERATORTYPE>(source);
-            Collections.sort(sortable);
-            _sortedIterator = sortable.iterator();
-        }
-        
-        public boolean hasNext()
-        {
-            return _sortedIterator.hasNext();
-        }
-        
-        public ITERATORTYPE next()
-        {
-            return _sortedIterator.next();
-        }
-        public void remove()
-        {
-            throw new UnsupportedOperationException();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIdentifiable.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIdentifiable.java
deleted file mode 100644
index 6e6368d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIdentifiable.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.internal.policy;
-
-/**
- * An object with an unique identity
- * @author cbateman
- * @param <IDTYPE> 
- *
- */
-public interface IIdentifiable<IDTYPE>
-{
-    /**
-     * @return the unique identifier
-     */
-    IDTYPE getId();
-    
-    /**
-     * @return a human-readable name for this identifier.
-     */
-    String getDisplayName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIteratorPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIteratorPolicy.java
deleted file mode 100644
index 6b567f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IIteratorPolicy.java
+++ /dev/null
@@ -1,33 +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.internal.policy;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * A policy that allows a strategy composite to change the order in which
- * it queries it's list of strategies.
- * 
- * @author cbateman
- * @param <ITERATORTYPE> 
- *
- */
-public interface IIteratorPolicy<ITERATORTYPE>
-{
-    /**
-     * @param forCollection 
-     * @return an iterator that controls the ordering through forCollection
-     * in a policy directed way.  The policy may take a copy of the collection
-     * or may choose to iterate in place.
-     */
-    Iterator<ITERATORTYPE>  getIterator(Collection<ITERATORTYPE> forCollection);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IdentifierOrderedIteratorPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IdentifierOrderedIteratorPolicy.java
deleted file mode 100644
index d5de574..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/IdentifierOrderedIteratorPolicy.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.common.internal.policy;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * 
- * @author cbateman
- *
- * @param <ITERATORTYPE>
- */
-public class IdentifierOrderedIteratorPolicy<ITERATORTYPE> implements
-        IIteratorPolicy<ITERATORTYPE>
-{
-    private final Iterable<ITERATORTYPE>   _policyOrder;
-    // controls whether the policy iterator will return items that are
-    // not explicitly listed in policyOrder.
-    private boolean                        _excludeNonExplicitValues = false;
-    
-    /**
-     * @param policyOrder
-     */
-    public IdentifierOrderedIteratorPolicy(final Iterable<ITERATORTYPE> policyOrder)
-    {
-        _policyOrder = policyOrder;
-    }
-    
-    /**
-     * Default value is <b>false</b>.
-     * 
-     * @return if true, the iterator will not return values in the forCollection
-     * passed to getIterator whose identifier are not explicitly listed in
-     * the policyOrder,  If false, these values will be return after all
-     * the policyOrder values have been returned.
-     */
-    public boolean isExcludeNonExplicitValues()
-    {
-        return _excludeNonExplicitValues;
-    }
-
-    /**
-     * @param excludeNonExplicitValues
-     */
-    public void setExcludeNonExplicitValues(boolean excludeNonExplicitValues)
-    {
-        _excludeNonExplicitValues = excludeNonExplicitValues;
-    }
-
-    public Iterator<ITERATORTYPE> getIterator(
-            final Collection<ITERATORTYPE> forCollection)
-    {
-        return new MyIterator<ITERATORTYPE>(forCollection, _excludeNonExplicitValues, _policyOrder);
-    }
-
-    private static class MyIterator<ITERATORTYPE> implements Iterator<ITERATORTYPE>
-    {
-        private final List<ITERATORTYPE>         _items;
-        private final Iterator<ITERATORTYPE>    _policyIterator;
-        private ITERATORTYPE                    _next;
-        
-        MyIterator(final Collection<ITERATORTYPE> collection,
-                final boolean excludeNonExplicitValues,
-                final Iterable<ITERATORTYPE> policyOrder)
-        {
-            _items = new ArrayList();
-            _items.addAll(collection);
-
-            _policyIterator = policyOrder.iterator();
-            _next = findNext();
-        }
-        
-        public boolean hasNext()
-        {
-            return _next != null;
-        }
-
-        public ITERATORTYPE next()
-        {
-            if (_next != null)
-            {
-                ITERATORTYPE next = _next;
-                //calculate next one before returning
-                _next = findNext();
-                return next;
-            }
-            
-            throw new NoSuchElementException("No more elements");
-        }
-
-        public void remove()
-        {
-            throw new UnsupportedOperationException();
-        }
-        
-        private ITERATORTYPE findNext()
-        {
-            while (_policyIterator.hasNext())
-            {
-                ITERATORTYPE next = _policyIterator.next();
-                if (_items.contains(next))
-                {
-                    _items.remove(next);
-                    return next;
-                }
-            }
-            
-            // we have exhausted the _items that are in the policy iterator
-            // now return any further _items in the order they are in the list
-            if (_items.size() > 0)
-            {
-                return _items.remove(0);
-            }
-            
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/OrderedListProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/OrderedListProvider.java
deleted file mode 100644
index 7540755..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/policy/OrderedListProvider.java
+++ /dev/null
@@ -1,178 +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.internal.policy;
-
-import java.util.List;
-
-/**
- * Provides a list of order, enablement-modifiable objects.
- * 
- * @author cbateman
- * 
- */
-public abstract class OrderedListProvider
-{
-    private List<OrderableObject> _orderableObjects;
-
-    /**
-     * 
-     * @return the list of ordered objects
-     */
-    public final List<OrderableObject> getOrderedObjects()
-    {
-        if (_orderableObjects == null)
-        {
-            _orderableObjects = createAndPopulateOrderedObjects();
-        }
-        return _orderableObjects;
-    }
-    
-    /**
-     * <p>Clears the orderableObjects collection so that the next call
-     * of getOrderedObjects() </p>
-     */
-    public final void resetOrderedObjects()
-    {
-        _orderableObjects = null;
-    }
-
-    /**
-     * Move the object one toward the front of the list
-     * 
-     * @param object
-     */
-    public final void moveUp(final OrderableObject object)
-    {
-        final List<OrderableObject>     list = getOrderedObjects();
-        final int index = list.indexOf(object);
-        if (index > 0)
-        {
-            OrderableObject item = list.remove(index);
-            list.add(index - 1, item);
-        }
-    }
-
-    /**
-     * Move the object one toward the end
-     * @param object
-     */
-    public final void moveDown(final OrderableObject object)
-    {
-        final List<OrderableObject>     list = getOrderedObjects();
-        int index = list.indexOf(object);
-        if (index < list.size() - 1)
-        {
-            OrderableObject item = list.remove(index);
-            list.add(index + 1, item);
-        }
-    }
-
-    /**
-     * @return a new list orderable objects populate in their initial order
-     * The list must be modifiable.
-     */
-    protected abstract List<OrderableObject> createAndPopulateOrderedObjects();
-
-    /**
-     * Proxy object for ordering in list
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class OrderableObject implements Cloneable
-    {
-        private boolean _enabled;
-        private Object  _object;
-
-        /**
-         * @param object
-         * @param enabled
-         */
-        public OrderableObject(final Object object, final boolean enabled)
-        {
-            _object = object;
-            _enabled = enabled;
-        }
-
-        private OrderableObject(final OrderableObject copyMe)
-        {
-            _object = copyMe._object;
-            _enabled = copyMe._enabled;
-        }
-
-        /**
-         * @return true if this object is enabled
-         */
-        public boolean isEnabled()
-        {
-            return _enabled;
-        }
-
-        /**
-         * @param enabled
-         */
-        public void setEnabled(boolean enabled)
-        {
-            _enabled = enabled;
-        }
-
-        /**
-         * @return the object in the ordered list
-         */
-        public Object getObject()
-        {
-            return _object;
-        }
-
-        /**
-         * @param object
-         */
-        public void setObject(Object object)
-        {
-            _object = object;
-        }
-
-        @Override
-        public OrderableObject clone()
-        {
-            return new OrderableObject(this);
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj instanceof OrderableObject)
-            {
-                if (_enabled == ((OrderableObject)obj)._enabled)
-                {
-                    Object other = ((OrderableObject)obj)._object;
-                    if (other != null)
-                    {
-                        return other.equals(_object);
-                    }
-                    return _object == null;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int enabledCode = _enabled ? 0xcccccccc : 0x33333333;
-            if (_object == null)
-            {
-                return enabledCode;
-            }
-            return _object.hashCode() ^ enabledCode;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
deleted file mode 100644
index 70e0e95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.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.jsf.common.internal.resource;
-
-/**
- * Listener can register for events ona particular LifecycleListener
- * 
- * @author cbateman
- *
- */
-public interface IResourceLifecycleListener
-{
-    /**
-     * Listener accepts the resource lifecycle event
-     * 
-     * @param event
-     * @return the result of accepting the event
-     */
-    EventResult acceptEvent(ResourceLifecycleEvent event);
-
-    /**
-     * @author cbateman
-     *
-     */
-    public static class EventResult
-    {
-        private static EventResult DEFAULT;
-
-        /**
-         * @return an event result with defaults initialized
-         */
-        public synchronized static EventResult getDefaultEventResult()
-        {
-            if (DEFAULT == null)
-            {
-                DEFAULT = new EventResult()
-                {
-                    @Override
-                    protected void setDisposeAfterEvent(final boolean disposeAfterEvent)
-                    {
-                        throw new UnsupportedOperationException();
-                    }
-                };
-            }
-            return DEFAULT;
-        }
-
-        private static EventResult DISPOSE_AFTER_EVENT;
-
-        /**
-         * @return an event result with default except dispose after
-         * is set
-         */
-        public synchronized static EventResult getDisposeAfterEventResult()
-        {
-            if (DISPOSE_AFTER_EVENT == null)
-            {
-                DISPOSE_AFTER_EVENT = new EventResult()
-                {
-                    /**
-                     * @return the remove listener flag
-                     */
-                    @Override
-                    public boolean getDisposeAfterEvent()
-                    {
-                        return true;
-                    }
-
-                    /**
-                     * @param disposeAfterEvent
-                     */
-                    @Override
-                    protected void setDisposeAfterEvent(final boolean disposeAfterEvent) {
-                        _disposeAfterEvent = disposeAfterEvent;
-                    }
-
-                };
-            }
-            return DISPOSE_AFTER_EVENT;
-        }
-
-        /**
-         * set to true if after the current event is finished firing, the source
-         * should be disposed. If self-disposal is not applicable, the flag is ignored
-         */
-        protected boolean _disposeAfterEvent;
-
-        /**
-         * @return the remove listener flag
-         */
-        public boolean getDisposeAfterEvent()
-        {
-            return _disposeAfterEvent;
-        }
-
-        /**
-         * @param disposeAfterEvent
-         */
-        protected void setDisposeAfterEvent(final boolean disposeAfterEvent) {
-            _disposeAfterEvent = disposeAfterEvent;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ImmutableLifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ImmutableLifecycleListener.java
deleted file mode 100644
index 8614083..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ImmutableLifecycleListener.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.common.internal.resource;
-
-
-/**
- * A lifecycle listener abstraction that cannot have its resources modified.
- * Clients may only register and deregister for events.
- *
- * @author cbateman
- *
- */
-public abstract class ImmutableLifecycleListener
-{
-
-    /**
-     * Adds listener to the list of objects registered to receive 
-     * lifecycle events for this resource.  Only adds the listener
-     * if it is not already in the list.
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     * 
-     * @param listener
-     */
-    public abstract void addListener(final IResourceLifecycleListener listener);
-
-    /**
-     * Removes listener from the list of registered listeners
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     *
-     * @param listener
-     */
-    public abstract void removeListener(final IResourceLifecycleListener listener);
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
deleted file mode 100644
index 4be8cb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
+++ /dev/null
@@ -1,388 +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.internal.resource;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-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.ResourcesPlugin;
-import org.eclipse.jst.jsf.common.internal.ITestTracker;
-import org.eclipse.jst.jsf.common.internal.ITestTracker.Event;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-
-/**
- * Listens to resource changes and fires lifecycle events
- * 
- * @author cbateman
- * 
- */
-public class LifecycleListener extends ImmutableLifecycleListener implements
-        IResourceChangeListener
-{
-    private final static boolean                           ENABLE_TEST_TRACKING = false;
-    private static long                                    _seqId;
-
-    private final CopyOnWriteArrayList<IResource>          _resources;
-    final CopyOnWriteArrayList<IResourceLifecycleListener> _listeners;
-    private AtomicBoolean                                  _isDisposed          = new AtomicBoolean(
-                                                                                        false);
-    private ITestTracker                                   _testTracker;                       // ==
-                                                                                                // null;
-                                                                                                // initialized
-                                                                                                // by
-                                                                                                // setter
-                                                                                                // injection
-
-    /**
-     * Initialize an inactive lifecycle listener. A workspace listener will not
-     * be installed by this constructor. The object created using this
-     * constructor will not fire any events until addResource is called at least
-     * once to add a target resource
-     */
-    public LifecycleListener()
-    {
-        _resources = new CopyOnWriteArrayList<IResource>();
-        _listeners = new CopyOnWriteArrayList<IResourceLifecycleListener>();
-    }
-
-    /**
-     * Create a new lifecycle listener for the res
-     * 
-     * @param res
-     */
-    public LifecycleListener(final IResource res)
-    {
-        this();
-        _resources.add(res);
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-    }
-
-    /**
-     * @param resources
-     */
-    public LifecycleListener(final List<IResource> resources)
-    {
-        this();
-        _resources.addAll(resources);
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-    }
-
-    /**
-     * @param testTracker
-     */
-    public final void setTestTracker(final ITestTracker testTracker)
-    {
-        _testTracker = testTracker;
-    }
-
-    /**
-     * Adds listener to the list of objects registered to receive lifecycle
-     * events for this resource. Only adds the listener if it is not already in
-     * the list.
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     * 
-     * @param listener
-     */
-    public void addListener(final IResourceLifecycleListener listener)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException();
-        }
-        _listeners.addIfAbsent(listener);
-    }
-
-    /**
-     * Removes listener from the list of registered listeners
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     * 
-     * @param listener
-     */
-    public void removeListener(final IResourceLifecycleListener listener)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException();
-        }
-        _listeners.remove(listener);
-    }
-
-    /**
-     * @param res
-     */
-    public void addResource(final IResource res)
-    {
-        synchronized (_resources)
-        {
-            // don't add any resources if we've disposed before acquiring the
-            // lock
-            if (isDisposed())
-            {
-                return;
-            }
-
-            final int preSize = _resources.size();
-            if (!_resources.contains(res))
-            {
-                _resources.add(res);
-            }
-
-            // if the size of the array was 0
-            // and is now greater, make sure the listener is added
-            if (preSize == 0 && _resources.size() > 0)
-            {
-                ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-            }
-        }
-    }
-
-    /**
-     * If there are no longer resources being targeted, the resource change
-     * listener will be removed.
-     * 
-     * @param res
-     */
-    public void removeResource(final IResource res)
-    {
-        synchronized (_resources)
-        {
-            // don't bother with this stuff if we're disposed.
-            if (isDisposed())
-            {
-                return;
-            }
-            _resources.remove(res);
-
-            // if there are no longer target resources,
-            // remove the workspace listener
-            if (_resources.size() == 0)
-            {
-                ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-                        this);
-            }
-        }
-    }
-
-    /**
-     * Release the resource change listener
-     */
-    public void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            // ensure that add/removeResource don't cause races to add or
-            // remove the resource listener
-            synchronized (_resources)
-            {
-                // remove first to minimize the chance that the listener will
-                // be triggered during the remainder of dispose
-                ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-                        this);
-                _resources.clear();
-            }
-        }
-    }
-
-    /**
-     * @return true if the listener has been disposed
-     */
-    public boolean isDisposed()
-    {
-        return _isDisposed.get();
-    }
-
-    public void resourceChanged(final IResourceChangeEvent event)
-    {
-        final long seqId = _seqId++;
-
-        if (ENABLE_TEST_TRACKING && _testTracker != null)
-        {
-            _testTracker.fireEvent(Event.START_TRACKING, seqId,
-                    "trackMethod_resourceChanged");
-        }
-
-        assert (!isDisposed());
-
-        switch (event.getType())
-        {
-            case IResourceChangeEvent.PRE_CLOSE:
-            {
-                final IProject proj = (IProject) event.getResource();
-
-                // must use iterator to ensure copy on write behaviour
-                for (final IResource res : _resources)
-                {
-                    if (proj == res || proj == res.getProject())
-                    {
-                        fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                                EventType.RESOURCE_INACCESSIBLE,
-                                ReasonType.RESOURCE_PROJECT_CLOSED));
-                    }
-                }
-            }
-            break;
-
-            case IResourceChangeEvent.PRE_DELETE:
-            {
-                final IProject proj = (IProject) event.getResource();
-
-                // must use iterator to ensure copy on write behaviour
-                for (final IResource res : _resources)
-                {
-                    // if the resource being tracked is the resource being
-                    // deleted,
-                    // then fire a resource delete event
-                    if (proj == res)
-                    {
-                        fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                                EventType.RESOURCE_INACCESSIBLE,
-                                ReasonType.RESOURCE_DELETED));
-                    }
-                    // if the resource being tracked is a resource in the
-                    // project being
-                    // deleted, then fire a project deleted event
-                    else if (proj == res.getProject())
-                    {
-                        fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                                EventType.RESOURCE_INACCESSIBLE,
-                                ReasonType.RESOURCE_PROJECT_DELETED));
-                    }
-                }
-            }
-            break;
-
-            case IResourceChangeEvent.POST_CHANGE:
-            {
-                for (final IResource res : _resources)
-                {
-                    IResourceDelta delta = event.getDelta();
-
-                    // long seqId2 = _seqId++;
-                    // if (ENABLE_TEST_TRACKING && _testTracker != null)
-                    // {
-                    // _testTracker.fireEvent(Event.START_TRACKING, seqId2,
-                    // "testFindMember");
-                    // }
-                    // only care about post change events to resources
-                    // that we are tracking
-                    delta = delta.findMember(res.getFullPath());
-
-                    if (delta != null)
-                    {
-                        visit(delta);
-                    }
-
-                    // if (ENABLE_TEST_TRACKING && _testTracker != null)
-                    // {
-                    // _testTracker.fireEvent(Event.STOP_TRACKING, seqId2,
-                    // "testFindMember");
-                    // }
-                }
-            }
-            break;
-
-            default:
-                // do nothing
-                // we only handle these three
-        }
-
-        if (ENABLE_TEST_TRACKING && _testTracker != null)
-        {
-            _testTracker.fireEvent(Event.STOP_TRACKING, seqId,
-                    "trackMethod_resourceChanged");
-        }
-    }
-
-    private void fireLifecycleEvent(final ResourceLifecycleEvent event)
-    {
-        boolean disposeAfter = false;
-
-        // NOTE: must use iterator through _listeners so that
-        // CopyOnWriteArrayList protects us from concurrent modification
-        for (final IResourceLifecycleListener listener : _listeners)
-        {
-            final EventResult result = listener.acceptEvent(event);
-            disposeAfter |= result.getDisposeAfterEvent();
-        }
-
-        if (disposeAfter)
-        {
-            dispose();
-        }
-    }
-
-    private void visit(final IResourceDelta delta)
-    {
-        assert (!isDisposed());
-
-        final IResource res = delta.getResource();
-
-        // the wkspace root is a special case since even though
-        // it is registered as the target resource, we are interested
-        // in new projects created in the root
-        if (res.getType() == IResource.ROOT)
-        {
-            handleWorkspaceRoot(delta);
-        }
-
-        switch (delta.getKind())
-        {
-            case IResourceDelta.CHANGED:
-            {
-                // the contents of the file have changed
-                if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
-                {
-                    fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                            EventType.RESOURCE_CHANGED,
-                            ReasonType.RESOURCE_CHANGED_CONTENTS));
-                }
-            }
-            break;
-            case IResourceDelta.REMOVED:
-            {
-                fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                        EventType.RESOURCE_INACCESSIBLE,
-                        ReasonType.RESOURCE_DELETED));
-            }
-            break;
-        }
-    }
-
-    private void handleWorkspaceRoot(final IResourceDelta delta)
-    {
-        for (final IResourceDelta childDelta : delta
-                .getAffectedChildren(IResourceDelta.ADDED))
-        {
-            final IResource res = childDelta.getResource();
-            if ((childDelta.getFlags() & IResourceDelta.OPEN) != 0 &&
-            // project was just opened
-                    res.getType() == IResource.PROJECT)
-            {
-                fireLifecycleEvent(new ResourceLifecycleEvent(res,
-                        EventType.RESOURCE_ADDED, ReasonType.PROJECT_OPENED));
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
deleted file mode 100644
index 1484382..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
+++ /dev/null
@@ -1,120 +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.internal.resource;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * @author cbateman
- *
- */
-public class ResourceLifecycleEvent 
-{
-    /**
-     * the type of lifecycle event
-     * this enum is not closed and may add new fields in the future
-     */
-    public enum EventType
-    {
-        /**
-         * Indicates that the resource is no longer accessible (as testable with
-         * IResource.isAccessible).  The reasonType will indicate why.
-         */
-        RESOURCE_INACCESSIBLE,
-        
-        /**
-         * Indicates that the resource being tracked has changed in some
-         * way, use ReasonType to determine specifics
-         */
-        RESOURCE_CHANGED,
-        
-        /**
-         * Indicates that the resource being tracked hass been added.  Use
-         * ReasonType to determine specifics.
-         */
-        RESOURCE_ADDED;
-    }
-    
-    /**
-     * encodes the cause of the event if the event type provides one
-     * this enum is not closed and may add new fields in the future
-     */
-    public enum ReasonType
-    {
-        /**
-         * The resource was deleted from the workspace,
-         * this event is pre change if the event is project
-         * and post change otherwise
-         */
-        RESOURCE_DELETED,
-        /**
-         * The resource's project was deleted.  This event is 
-         * pre-change.  Note that if the tracked resource is 
-         * a project, RESOURCE_DELETED will be fired, not this
-         * event.
-         */
-        RESOURCE_PROJECT_DELETED,
-        /**
-         * The resource's project was closed.  This event is pre-change
-         */
-        RESOURCE_PROJECT_CLOSED,
-        /**
-         * Occurs when the contents of a non-project resource has changed 
-         */
-        RESOURCE_CHANGED_CONTENTS,
-        
-        /**
-         * Occurs when a project resource is added
-         */
-        PROJECT_OPENED,
-        /**
-         * Occurs when a non-project resource is added.
-         */
-        RESOURCE_ADDED
-    }
-
-    private final IResource   _affectedResource;
-    private final EventType   _eventType;
-    private final ReasonType  _reasonType;
-    
-    /**
-     * @param affectedResource
-     * @param eventType
-     * @param reasonType
-     */
-    public ResourceLifecycleEvent(IResource affectedResource, EventType eventType, ReasonType reasonType)
-    {
-        _affectedResource = affectedResource;
-        _eventType = eventType;
-        _reasonType = reasonType;
-    }
-
-    /**
-     * @return the affected resource
-     */
-    public IResource getAffectedResource() {
-        return _affectedResource;
-    }
-
-    /**
-     * @return the event that has occurred
-     */
-    public EventType getEventType() {
-        return _eventType;
-    }
-
-    /**
-     * @return the cause of the event
-     */
-    public ReasonType getReasonType() {
-        return _reasonType;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java
deleted file mode 100644
index bad92e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java
+++ /dev/null
@@ -1,268 +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.internal.resource;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-
-/**
- * An object manager that manages a single instanceof an IManagedObject per
- * resource. The manager takes care of ensuring that a managed object is
- * properly disposed when a resource lifecycle event renders it inaccessible
- * (i.e file is deleted, project is closed or delete).
- * 
- * @author cbateman
- * 
- * @param <RESOURCE>
- * @param <MANAGEDOBJECT>
- */
-public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IManagedObject, RESOURCE extends IResource>
-        extends ObjectManager<MANAGEDOBJECT, RESOURCE>
-{
-    // lazily initialized
-    private LifecycleListener                          _lifecycleListener;
-    private final Map<RESOURCE, ManagedResourceObject> _perResourceObjects;
-
-    /**
-     * Default constructor
-     */
-    protected ResourceSingletonObjectManager()
-    {
-        _perResourceObjects = new HashMap<RESOURCE, ManagedResourceObject>();
-    }
-
-    @Override
-    public final MANAGEDOBJECT getInstance(final RESOURCE key)
-    throws ManagedObjectException
-    {
-        synchronized(this)
-        {
-            runBeforeGetInstance(key);
-            ManagedResourceObject managedResObject = _perResourceObjects.get(key);
-    
-            if (managedResObject == null)
-            {
-                final MANAGEDOBJECT managedObject = createNewInstance(key);
-    
-                if (managedObject == null)
-                {
-                    throw new ManagedObjectException(
-                            "No object available for resource");
-                }
-                managedResObject = manageResource(key, managedObject);
-            }
-
-            runAfterGetInstance(key);
-            return managedResObject.getManagedObject();
-        }
-    }
-
-    /**
-     * @param resource
-     * @return a new instance of T associated with S. This operation must not
-     *         cache T: a brand new instance is always required. getInstance
-     *         will perform caching and resource listening.
-     */
-    protected abstract MANAGEDOBJECT createNewInstance(RESOURCE resource);
-
-    /**
-     * @param resource
-     */
-    protected void runBeforeGetInstance(final RESOURCE resource)
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param resource
-     */
-    protected void runAfterGetInstance(final RESOURCE resource)
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param resource
-     * @return true if there already exists a managed object associated with
-     * the resource
-     */
-    public synchronized boolean isInstance(RESOURCE resource)
-    {
-        return _perResourceObjects.containsKey(resource);
-    }
-
-    /**
-     * @return a copy of the current set of RESOURCE object keys that we
-     * are managing singletons for.  Collection is mutable, but as a copy,
-     * changes to it do not effect thie object manager.
-     */
-    public synchronized Collection<RESOURCE> getManagedResources()
-    {
-        final Set resources = new HashSet(_perResourceObjects.keySet());
-        return resources;
-    }
-    /**
-     * Should be called by concrete classes to indicate they have created a new
-     * managed object for resource, for which they want to track lifecycle
-     * changes.
-     * 
-     * @param resource
-     * @param managedObject
-     */
-    private synchronized ManagedResourceObject manageResource(final RESOURCE resource,
-            final MANAGEDOBJECT managedObject)
-    {
-        final LifecycleListener listener = lazilyGetLifecycleListener();
-        listener.addResource(resource);
-        final MyLifecycleEventListener eventListener = new MyLifecycleEventListener(
-                managedObject, resource);
-        listener.addListener(eventListener);
-
-        final ManagedResourceObject managedResourceObject = new ManagedResourceObject(
-                managedObject, eventListener);
-        _perResourceObjects.put(resource, managedResourceObject);
-        return managedResourceObject;
-    }
-
-    /**
-     * Stop managing the resource. If resource is the last one, the resource
-     * change listener will be removed (it will be added again when next
-     * manageResource is called).
-     * 
-     * @param resource
-     */
-    protected final synchronized void unmanageResource(final RESOURCE resource)
-    {
-        final ManagedResourceObject managedResourceObject =
-            _perResourceObjects.remove(resource);
-        final LifecycleListener listener = lazilyGetLifecycleListener();
-
-        if (managedResourceObject != null)
-        {
-            listener.removeListener(managedResourceObject.getEventListener());
-        }
-
-        listener.removeResource(resource);
-    }
-
-    /**
-     * Call to register a listener
-     * 
-     * @param listener
-     */
-    protected final void addLifecycleEventListener(
-            final IResourceLifecycleListener listener)
-    {
-        final LifecycleListener lifecycleListener = lazilyGetLifecycleListener();
-        lifecycleListener.addListener(listener);
-    }
-
-    /**
-     * Call to remove a listener
-     * 
-     * @param listener
-     */
-    protected final void removeLifecycleEventListener(
-            final IResourceLifecycleListener listener)
-    {
-        final LifecycleListener lifecycleListener = lazilyGetLifecycleListener();
-        lifecycleListener.removeListener(listener);
-    }
-
-    private synchronized LifecycleListener lazilyGetLifecycleListener()
-    {
-        if (_lifecycleListener == null)
-        {
-            _lifecycleListener = new LifecycleListener();
-        }
-        return _lifecycleListener;
-    }
-
-    private class ManagedResourceObject
-    {
-        private final MANAGEDOBJECT            _managedObject;
-        private final MyLifecycleEventListener _eventListener;
-
-        private ManagedResourceObject(final MANAGEDOBJECT managedObject,
-                final MyLifecycleEventListener eventListener)
-        {
-            _managedObject = managedObject;
-            _eventListener = eventListener;
-        }
-
-        public MANAGEDOBJECT getManagedObject()
-        {
-            return _managedObject;
-        }
-
-        public MyLifecycleEventListener getEventListener()
-        {
-            return _eventListener;
-        }
-    }
-
-    private class MyLifecycleEventListener implements
-    IResourceLifecycleListener
-    {
-        private final RESOURCE      _resource;
-        private final MANAGEDOBJECT _managedObject;
-
-        private MyLifecycleEventListener(final MANAGEDOBJECT managedObject,
-                final RESOURCE resource)
-        {
-            _resource = resource;
-            _managedObject = managedObject;
-        }
-
-        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-        {
-            final EventResult result = EventResult.getDefaultEventResult();
-
-            // not interested
-            if (!_resource.equals(event.getAffectedResource()))
-            {
-                return EventResult.getDefaultEventResult();
-            }
-
-            if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-            {
-                try
-                {
-                    if (event.getReasonType() == ReasonType.RESOURCE_DELETED
-                            || event.getReasonType() == ReasonType.RESOURCE_PROJECT_DELETED)
-                    {
-                        _managedObject.destroy();
-                    }
-                    else
-                    {
-                        _managedObject.dispose();
-                    }
-                }
-                // dispose is external code out our control, so make sure
-                // unmanage gets called if it blows up.
-                finally
-                {
-                    unmanageResource(_resource);
-                }
-            }
-            return result;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IIdentifiableStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IIdentifiableStrategy.java
deleted file mode 100644
index 94cf53d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IIdentifiableStrategy.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.internal.strategy;
-
-import org.eclipse.jst.jsf.common.internal.policy.IIdentifiable;
-
-
-/**
- * A simple strategy that is identifiable
- * 
- * @author cbateman
- *
- * @param <INPUT>
- * @param <OUTPUT>
- * @param <IDTYPE>
- */
-public interface IIdentifiableStrategy<INPUT, OUTPUT, IDTYPE> 
-    extends ISimpleStrategy<INPUT, OUTPUT>, IIdentifiable<IDTYPE>
-{
-    // nothing added.
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/ISimpleStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/ISimpleStrategy.java
deleted file mode 100644
index 787a310..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/ISimpleStrategy.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.internal.strategy;
-
-/**
- * A strategy that takes an INPUT, performs a calculation on it, and returns
- * an OUTPUT
- * @author cbateman
- *
- * @param <INPUT>
- * @param <OUTPUT>
- */
-public interface ISimpleStrategy<INPUT, OUTPUT>
-{
-    /**
-     * Perform the algorithm on input and return OUTPUT.  This type of
-     * operation should avoid side-effects, but may throw exceptions.
-     * 
-     * @param input
-     * @return the result of the strategy algorithm
-     * @throws Exception implementers should narrow what exceptions are thrown.
-     */
-    public OUTPUT perform(INPUT input) throws Exception;
-    
-    /**
-     * @return the single value that perform will return if it cannot calculate
-     * a meaningful result for an input.  The value must be unique, the same
-     * for all inputs and must be testable using the '==' operator.
-     */
-    public OUTPUT getNoResult();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IteratorPolicyBasedStrategyComposite.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IteratorPolicyBasedStrategyComposite.java
deleted file mode 100644
index b64a75c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/IteratorPolicyBasedStrategyComposite.java
+++ /dev/null
@@ -1,120 +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.internal.strategy;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.internal.policy.IIteratorPolicy;
-
-/**
- * A strategy composite that uses an iterator policy to provide the iterator
- * used to decide what order to execute the strategy in.
- * 
- * This composite represents a grouping of strategies which represent N ways
- * to perform a particular calculation and which any number for those N ways
- * may be applicable to any particular situation given the policy in place.
- * 
- * @author cbateman
- * 
- * @param <INPUT>
- * @param <OUTPUT>
- * @param <IDTYPE>
- * @param <STRATEGYTYPE>
- */
-public abstract class IteratorPolicyBasedStrategyComposite<INPUT, OUTPUT, IDTYPE, STRATEGYTYPE extends IIdentifiableStrategy<INPUT, OUTPUT, IDTYPE>>
-        extends StrategyComposite<INPUT, OUTPUT, IDTYPE, STRATEGYTYPE>
-{
-    private final Map<IDTYPE, STRATEGYTYPE> _strategies;
-    private IIteratorPolicy<IDTYPE>         _policy;
-
-    /**
-     * @param policy 
-     */
-    protected IteratorPolicyBasedStrategyComposite(final IIteratorPolicy<IDTYPE> policy)
-    {
-        _policy = policy;
-        _strategies = new HashMap<IDTYPE, STRATEGYTYPE>();
-    }
-
-    /**
-     * Add strategy if not already present.
-     * 
-     * @param strategy
-     */
-    public final void addStrategy(final STRATEGYTYPE strategy)
-    {
-        _strategies.put(strategy.getId(), strategy);
-    }
-
-    /**
-     * @param strategy
-     */
-    public final void removeStrategy(final STRATEGYTYPE strategy)
-    {
-        _strategies.remove(strategy.getId());
-    }
-
-    /**
-     * Change the active policy used to select the order in which the composite
-     * calls it's child strategies.
-     * 
-     * If the policy is not set, then strategies are called in 
-     * 
-     * @param policy
-     */
-    public final void setPolicy(final IIteratorPolicy<IDTYPE>  policy)
-    {
-        _policy = policy;
-    }
-
-    @Override
-    public final Iterator<STRATEGYTYPE> getIterator()
-    {
-        final Iterator<IDTYPE> idType = _policy.getIterator(_strategies
-                .keySet());
-        return new StrategyIterator<IDTYPE, STRATEGYTYPE>(_strategies, idType);
-    }
-
-    @Override
-    public abstract OUTPUT getNoResult();
-
-    private static class StrategyIterator<IDTYPE, STRATEGYTYPE> implements
-            Iterator<STRATEGYTYPE>
-    {
-        private final Map<IDTYPE, STRATEGYTYPE> _map;
-        private final Iterator<IDTYPE>          _policyIterator;
-
-        private StrategyIterator(final Map<IDTYPE, STRATEGYTYPE> map,
-                final Iterator<IDTYPE> policyIterator)
-        {
-            _map = map;
-            _policyIterator = policyIterator;
-        }
-
-        public boolean hasNext()
-        {
-            return _policyIterator.hasNext();
-        }
-
-        public STRATEGYTYPE next()
-        {
-            IDTYPE id = _policyIterator.next();
-            return _map.get(id);
-        }
-
-        public void remove()
-        {
-            throw new UnsupportedOperationException();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/StrategyComposite.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/StrategyComposite.java
deleted file mode 100644
index c51dbbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/strategy/StrategyComposite.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.common.internal.strategy;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * A composite strategy whos role is to iterate through a number of child
- * stategies until one returns a valid value for an input.
- * 
- * @author cbateman
- * 
- * @param <INPUT>
- * @param <OUTPUT>
- * @param <IDTYPE> 
- * @param <STRATEGYTYPE>
- */
-public abstract class StrategyComposite<INPUT, OUTPUT, IDTYPE, STRATEGYTYPE extends IIdentifiableStrategy<INPUT, OUTPUT, IDTYPE>>
-        implements ISimpleStrategy<INPUT, OUTPUT>
-{
-    public final OUTPUT perform(final INPUT input)
-    {
-        final Iterator<STRATEGYTYPE> sIt = getIterator();
-
-        OUTPUT result = getNoResult();
-        boolean resultFound = false;
-
-        EXECUTE_LOOP: while (sIt.hasNext())
-        {
-            final STRATEGYTYPE strategy = sIt.next();
-            try
-            {
-                result = strategy.perform(input);
-
-                if (result != strategy.getNoResult())
-                {
-                    resultFound = true;
-                    break EXECUTE_LOOP;
-                }
-            }
-            catch (Exception e)
-            {
-                JSFCommonPlugin.log(e);
-            }
-        }
-
-        if (resultFound)
-        {
-            return result;
-        }
-        return getNoResult();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy#getNoResult()
-     */
-    public abstract OUTPUT getNoResult();
-
-    /**
-     * @return an iterator that will return the next strategy to be executed
-     */
-    public abstract Iterator<STRATEGYTYPE> getIterator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.java
deleted file mode 100644
index 6055e5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents a BooleanLiteral as defined by JSP.2.9
- * 
- * @author cbateman
- *
- */
-public class BooleanLiteralType extends LiteralType 
-{
-    /**
-     * The literal FALSE singleton
-     */
-    public final static BooleanLiteralType  FALSE = new BooleanLiteralType(false);
-    /**
-     * The literal TRUE singleton
-     */
-    public final static BooleanLiteralType  TRUE = new BooleanLiteralType(true);
-    
-    private final boolean       _literalValue;
-    
-    
-    /**
-     * @param value
-     * @return a constant boolean literal type corresponding to value
-     */
-    public static BooleanLiteralType valueOf(boolean value)
-    {
-        return value ? TRUE : FALSE;
-    }
-    
-    /**
-     * @param literalValue
-     */
-    /*package*/BooleanLiteralType(boolean  literalValue)
-    {
-        super(Signature.SIG_BOOLEAN);
-        _literalValue = literalValue;
-    }
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        // illegal to coerce boolean to number per JSP.2.8.3 step 3
-        throw new TypeCoercionException("Cannot coerce boolean to number"); //$NON-NLS-1$
-    }
-
-    public String getLiteralValue() 
-    {
-        return Boolean.toString(_literalValue);
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return Boolean.valueOf(_literalValue);
-    }
-
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        return Boolean.valueOf(_literalValue);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java
deleted file mode 100644
index 9069f05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java
+++ /dev/null
@@ -1,172 +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.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-
-/**
- * Encapsulates the runtime type or types of a JSF entity in a 
- * way that can be compared to other entities
- * 
- * @author cbateman
- *
- */
-public class CompositeType 
-{
-    private final String[]  _signatures;
-    private final int       _assignmentType;
-    
-    private boolean[]       _isTypeSignature; // = null lazily derived from signatures
-                                              // on first access
-    /**
-     * @param signatureStrings
-     * @param assignmentType 
-     */
-    public CompositeType(String[] signatureStrings, int  assignmentType)
-    {
-        if (signatureStrings == null
-                || signatureStrings.length < 1)
-        {
-            throw new AssertionError("Must specify at least one signature string"); //$NON-NLS-1$
-        }
-        
-        _signatures = new String[signatureStrings.length];
-        System.arraycopy(signatureStrings, 0, _signatures, 0, _signatures.length);
-        _assignmentType = assignmentType;
-    }
-    
-    /**
-     * Convenience constructor for most common case where composite only 
-     * consistes of a single type signature
-     * 
-     * @param signatureString
-     * @param assignmentType
-     */
-    public CompositeType(String signatureString, int assignmentType)
-    {
-        this(new String[]{signatureString}, assignmentType);
-    }
-    /**
-     * @return the assignment type mask
-     */
-    public int getAssignmentTypeMask()
-    {
-        return _assignmentType;
-    }
-    
-    /**
-     * @return true if the composite type supports being on the LHS of an
-     * assignment
-     */
-    public boolean isLHS()
-    {
-        return TypeUtil.matchesLHS(_assignmentType);
-    }
-    
-    /**
-     * @return true if the composite type supports being on the RHS of an
-     * assignment
-     */
-    public boolean isRHS()
-    {
-        return TypeUtil.matchesRHS(_assignmentType);
-    }
-
-    /**
-     * @return an array of booleans.  The value in each index of the array
-     * is true if the corresponding position _signatures corresponds to a type
-     * signature and false if it's a method signature
-     */
-    public boolean[] getIsTypeSignature()
-    {
-        return getTypeSignatureFlags();
-    }
-    
-    /**
-     * @return the type signatures.  Changes to the returned form do not
-     * affect the internal values
-     */
-    public String[] getSignatures()
-    {
-        final String[] copy = new String[_signatures.length];
-        System.arraycopy(_signatures, 0, copy, 0, _signatures.length);
-        return copy;
-    }
-    
-    public String toString()
-    {
-        final StringBuffer stringBuffer = new StringBuffer();
-        
-        for (int i = 0; i < _signatures.length; i++)
-        {
-            stringBuffer.append(_signatures[i]);
-            stringBuffer.append(" | "); //$NON-NLS-1$
-        }
-        
-        return stringBuffer.toString();
-    }
-    
-    /**
-     * @return a version of to string with of the type signatures replaced
-     * with their more Javaeseque names
-     */
-    public String toUserReadableString()
-    {
-        final StringBuffer stringBuffer = new StringBuffer();
-        
-        for (int i = 0; i < _signatures.length; i++)
-        {
-            final String signature = _signatures[i];
-            
-            if (getTypeSignatureFlags()[i])
-            {
-                stringBuffer.append(Signature.getSignatureSimpleName(signature));
-            }
-            
-            if (i < _signatures.length -1)
-            {
-                stringBuffer.append(", "); //$NON-NLS-1$
-            }
-        }
-        return stringBuffer.toString();
-    }
-    
-    private boolean[] getTypeSignatureFlags()
-    {
-        if (_isTypeSignature == null)
-        {
-            _isTypeSignature = new boolean[_signatures.length];
-            
-            for (int i = 0; i < _signatures.length; i++)
-            {
-                try
-                {
-                    Signature.getTypeSignatureKind(_signatures[i]);
-                    
-                    // if an exception wasn't thrown above, then it
-                    // is some sort of type signature
-                    _isTypeSignature[i] = true;
-                }
-                catch (IllegalArgumentException ae)
-                {
-                    // getTypeSignatureKind threw an exception, so
-                    // this signature is a method
-                    _isTypeSignature[i] = false;
-                }
-            }
-        }
-        
-        return _isTypeSignature;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.java
deleted file mode 100644
index 5f2aff4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.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.common.internal.types;
-
-
-/**
- * Follows type coercion rules codified in section JSP.2.8 of the 
- * JSP 2.0 Specification.
- * 
- * This class operates on CompositeType's and returns raw
- * Java signatures for the single resulting type coercion.
- * 
- * The rules are stretched a little bit since JSP.2.8 defines how to
- * coerce an *instance* A to a type T.  But since we have no runtime instances,
- * only their types, we approximate by taking what we know about the type of A
- * and coercing it T as best we can.  
- * 
- * Also, whereas the spec says to throw errors when coercion is not possible,
- * we have two cases:
- * 
- *  1) We can determine definitively that there is no coercion
- *  2) We cannot determine whether there is or isn't a coercion
- *  
- *  In case 1, we always throw an exception.  In case 2, we return null to indicate
- *  "indeterminate" result, rather than error.
- * 
- * @author cbateman
- *
- */
-public class CompositeTypeCoercer 
-{
-    /**
-     * This method follows JSP.2.8.3 except that rather than returning a specific
-     * type that has been coerced to, it determines the most exact possible type
-     * that typeOfA can be coerced to, to be number compatible.  The caller must
-     * decide what do with the return value compared to the type (N in the spec)
-     * that they want to coerce to.
-     * 
-     * @param typeOfA
-     * @return a new signature for the type of A after being coerced to a Number
-     * @throws TypeCoercionException if A can definitively not be coerced to
-     * a number
-     */
-    public static String coerceToNumber(final CompositeType typeOfA)
-                            throws TypeCoercionException
-    {
-        String coercedType = null;
-        boolean errorDetected = true;       // assume error: only false if we 
-                                            // find a member of typeOfA that 
-                                            // coerces to number
-        
-        // JSP.2.8.1 -- auto-box primitives
-        final CompositeType boxedTypeOfA = 
-            TypeTransformer.transformBoxPrimitives(typeOfA);
-        final boolean[] typesigs = boxedTypeOfA.getIsTypeSignature();
-        
-        // iterate through all of the signatures that represent types
-        // and find at least one that can be coerced to a number
-        for (int i = 0; i < typesigs.length; i++)
-        {
-            if (typesigs[i])
-            {
-                try
-                {
-                    final String testType = 
-                        TypeCoercer.coerceToNumber(boxedTypeOfA.getSignatures()[i]);
-
-                    if (testType != null)
-                    {
-                        // if we have already found a coercible type, then 
-                        // we need to return null, since we have a conflict that
-                        // we don't know how to resolve to a type??????
-                        if (coercedType != null)
-                        {
-                            return null;
-                        }
-                        
-                        coercedType = testType;
-                    }
-                    errorDetected = false; // we have found a number coercion or indeterminate
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // do nothing: so far error still detected
-                }
-            }
-        }
-        
-        // we have three choices:
-        // 1: if errorDetected was never cleared, we definitely never found
-        // a coerceable type, so throw exception
-        if (errorDetected)
-        {
-            throw new TypeCoercionException();
-        }
-        
-        // otherwise the flag was cleared return what we found
-        if (coercedType != null)
-        {
-            // need to unbox per JSP.2.8.1
-            coercedType =
-                TypeTransformer.transformUnboxPrimitives(coercedType);
-        }
-        
-        return coercedType;
-    }
-    
-    
-//    public static String coerceToBoolean(CompositeType compositeType)
-//    {
-//        
-//    }
- 
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.java
deleted file mode 100644
index 5631b87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.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.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents an FloatLiteral as defined by JSP.2.9
- * @author cbateman
- *
- */
-public class FloatLiteralType extends NumericTypeLiteral 
-{
-    private final double     _literalValue;
-    
-    /**
-     * @param literalValue
-     */
-    public FloatLiteralType(double literalValue)
-    {
-        // according to the notes to JSP.2.9, bullet 5, float literals are doubles
-        super(Signature.SIG_DOUBLE);
-        _literalValue = literalValue;
-    }
-    
-    protected Number getBoxedValue() 
-    {
-        return new Double(_literalValue);
-    }
-
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        if (T == BigInteger.class)
-        {
-            return new BigDecimal(_literalValue).toBigInteger();
-        }
-        else if (T == BigDecimal.class)
-        {
-            return new BigDecimal(_literalValue);
-        }
-        
-        Number commonCoercion = super.coerceToNumber(T);
-
-        if (commonCoercion == null)
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-
-        return commonCoercion;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.java
deleted file mode 100644
index 8b74dfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * Defines the lhs/rhs rules for a type
- * @author cbateman
- *
- */
-public interface IAssignable 
-{
-    /**
-     * Type is none: it cannot be assigned to.  method binding.
-     */
-    public static int  ASSIGNMENT_TYPE_NONE = 0x0;
-    /**
-     * Type is lhs: it can be assigned to
-     */
-    public static int  ASSIGNMENT_TYPE_LHS = 0x1;
-    
-    /**
-     * Type is rhs: it can be assigned from
-     */
-    public static int  ASSIGNMENT_TYPE_RHS = 0x2;
-    
-    /**
-     * @return the assigment mask
-     */
-    public int  getAssignability();
-    
-    /**
-     * @return true if ASSIGNMENT_TYPE_LHS is set in getAssignability
-     */
-    public boolean isLHS();
-    /**
-     * @return true if ASSIGNMENT_TYPE_RHS is set in getAssignability
-     */
-    public boolean isRHS();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java
deleted file mode 100644
index d7a3be8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java
+++ /dev/null
@@ -1,73 +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.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents a IntegerLiteral as defined by JSP.2.9
- * @author cbateman
- *
- */
-public class IntegerLiteralType extends NumericTypeLiteral
-{
-    /**
-     * A singleton for zero literals
-     */
-    public final static IntegerLiteralType      ZERO = new IntegerLiteralType(0);
-    
-    private final long   _literalValue;
-    
-    /**
-     * @param literalValue
-     */
-    public IntegerLiteralType(long literalValue)
-    {
-        // according to the notes to JSP.2.9, bullet 4, integer literals are longs
-        super(Signature.SIG_LONG);
-        _literalValue = literalValue;
-    }
-    
-    protected Number getBoxedValue() 
-    {
-        return Long.valueOf(_literalValue);
-    }
-
-    /**
-     * Per JSP.2.8.3, step 5
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToNumber(java.lang.Class)
-     */
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {        
-        if (T == BigInteger.class)
-        {
-            return BigInteger.valueOf(_literalValue);
-        }
-        else if (T == BigDecimal.class)
-        {
-            return BigDecimal.valueOf(_literalValue);
-        }
-        
-        Number commonCoercion = super.coerceToNumber(T);
-
-        if (commonCoercion == null)
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-
-        return commonCoercion;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java
deleted file mode 100644
index 3ea6de5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java
+++ /dev/null
@@ -1,80 +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.common.internal.types;
-
-
-/**
- * Encodes a type signature and a string that has some literal value based on
- * the type signature.  The class represents only a value object -- no attempt
- * is made to assert that the literalValue is really of the type specified.
- * 
- * @author cbateman
- *
- */
-public abstract class LiteralType extends ValueType
-{
-    
-    /**
-     * Consider a new literal type
-     * 
-     * @param signature
-     */
-    protected LiteralType(final String signature)
-    {
-        super(signature, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    /**
-     * @return the literal value string (unparsed)
-     */
-    public abstract String getLiteralValue();
-
-    /**
-     * @return the actual untranslated literal value as an object
-     */
-    public abstract Object getLiteralValueRaw();
-    
-    /**
-     * @return the type signature
-     */
-    public final String getSignature() {
-        return super.getSignature();
-    }
-    
-    /**
-     * @return a type signature for the kind of number this literal will coerce
-     * into when asked to become a number or null if this cannot be determined
-     * @throws TypeCoercionException if this literal has no legal coercion into
-     * a number
-     */
-    public String getNumberCoercion() throws TypeCoercionException
-    {
-       // always box before coercion 
-       return
-           TypeCoercer.coerceToNumber(
-                   TypeTransformer.transformBoxPrimitives(getSignature()));
-    }
-    
-    /**
-     * @param T
-     * @return a Number coercion of the literal's value, null if indeterminate
-     * @throws TypeCoercionException if the coercion is illegal
-     */
-    public abstract Number coerceToNumber(Class T) throws TypeCoercionException;
-    
-    /**
-     * @return a Boolean coercion of the literal's value, null if indeterminate
-     * @throws TypeCoercionException if the coercion is illegal
-     */
-    public abstract Boolean coerceToBoolean() throws TypeCoercionException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java
deleted file mode 100644
index b3db7a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java
+++ /dev/null
@@ -1,42 +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.common.internal.types;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message bundle
- * 
- */
-public class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.internal.types.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external construction
-    }
-
-    /**
-     * @param key
-     * @return the 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.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.java
deleted file mode 100644
index 38e47b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.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.common.internal.types;
-
-/**
- * Signature type for method bindings in an EL expression
- * 
- * @author cbateman
- *
- */
-public class MethodType implements SignatureBasedType 
-{
-    private final String        _methodName;
-    private final String        _signature;
-
-    /**
-     * @param methodName
-     * @param signature
-     */
-    public MethodType(final String methodName, final String signature)
-    {
-        _methodName = methodName;
-        _signature = signature;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.common.internal.types.SignatureBasedType#getSignature()
-     */
-    public String getSignature() 
-    {
-        return _signature;
-    }
-
-    /**
-     * @return the method name signature
-     */
-    public String getMethodName() 
-    {
-        return _methodName;
-    }
-
-    public CompositeType toCompositeType() 
-    {
-        return new CompositeType(_signature, IAssignable.ASSIGNMENT_TYPE_NONE);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java
deleted file mode 100644
index eeb43e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java
+++ /dev/null
@@ -1,110 +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.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * Represents a NullLiteralType per JSP.2.9
- * 
- * @author cbateman
- *
- */
-public class NullLiteralType extends LiteralType 
-{
-    /**
-     * The singleton null literal
-     */
-    public final static NullLiteralType SINGLETON = new NullLiteralType();
-    
-    /**
-     * Construct a new null
-     */
-    private NullLiteralType()
-    {
-        super(TypeConstants.TYPE_NULL); // use void to indicate null in this situation
-    }
-    
-    /**
-     * Per JSP.2.8.5 null is always false
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToBoolean()
-     */
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        return Boolean.FALSE;
-    }
-
-    /**
-     * Per JSP.2.8.3, null is always 0
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToNumber(java.lang.Class)
-     */
-    public Number coerceToNumber(Class T) throws TypeCoercionException {
-        if (T == BigInteger.class)
-        {
-            return BigInteger.ZERO;
-        }
-        else if (T == BigDecimal.class)
-        {
-            return new BigDecimal(0.0);
-        }
-        else if (T == Double.class || T == Double.TYPE)
-        {
-            return new Double(0.0);
-        }
-        else if (T == Float.class || T == Float.TYPE)
-        {
-            return new Float(0.0);
-        }
-        else if (T == Long.class || T == Long.TYPE)
-        {
-            return Long.valueOf(0L);
-        }
-        else if (T == Integer.class || T == Integer.TYPE)
-        {
-            return Integer.valueOf(0);
-        }
-        else if (T == Short.class || T == Short.TYPE)
-        {
-            return Short.valueOf((short)0);
-        }
-        else if (T == Byte.class || T == Byte.TYPE)
-        {
-            return Byte.valueOf((byte)0);
-        }
-        else
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Per JSP.2.8.2 null is always an empty string
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#getLiteralValue()
-     */
-    public String getLiteralValue() 
-    {
-        return ""; //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.LiteralType#getLiteralValueRaw()
-     */
-    public Object getLiteralValueRaw() 
-    {
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.java
deleted file mode 100644
index 8b6acbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-
-/**
- * Common super-type for Float and Integer literals
- * @author cbateman
- *
- */
-public abstract class NumericTypeLiteral extends LiteralType 
-{
-    /**
-     * @param signature
-     */
-    protected NumericTypeLiteral(String signature)
-    {
-        super(signature);
-    }
-    
-    /**
-     * @return the boxed form of the numeric literal value
-     */
-    protected abstract Number getBoxedValue();
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        Number boxedLiteralValue = getBoxedValue();
-        
-        if (T == Double.class || T == Double.TYPE)
-        {
-            return new Double(boxedLiteralValue.doubleValue());
-        }
-        else if (T == Float.class || T == Float.TYPE)
-        {
-            return new Float(boxedLiteralValue.floatValue());
-        }
-        else if (T == Long.class || T == Long.TYPE)
-        {
-            return boxedLiteralValue;
-        }
-        else if (T == Integer.class || T == Integer.TYPE)
-        {
-            return Integer.valueOf(boxedLiteralValue.intValue());
-        }
-        else if (T == Short.class || T == Short.TYPE)
-        {
-            return Short.valueOf(boxedLiteralValue.shortValue());
-        }
-        else if (T == Byte.class || T == Byte.TYPE)
-        {
-            return Byte.valueOf(boxedLiteralValue.byteValue());
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public String getLiteralValue() 
-    {
-        return getBoxedValue().toString();
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return getBoxedValue();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.LiteralType#coerceToBoolean()
-     */
-    public Boolean coerceToBoolean() throws TypeCoercionException {
-        // JSP.2.8.5 does not provide for number -> boolean coercion
-        throw new TypeCoercionException("Cannot coerce number to boolean"); //$NON-NLS-1$
-    }
-
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.java
deleted file mode 100644
index 41e2bb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * Defines a signature-based type.  Signatures must conform to the JVM
- * type signature format as defined in the JVM specs and in the JDT Signature 
- * class
- * 
- * @author cbateman
- *
- */
-public interface SignatureBasedType 
-{
-    /**
-     * @return the signature string
-     */
-    public String getSignature();
-    
-    /**
-     * @return a version of the this type in CompositeType form
-     */
-    public CompositeType toCompositeType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java
deleted file mode 100644
index 2e887fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java
+++ /dev/null
@@ -1,131 +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.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * Represents a StringLiteral as defined by JSP.2.9
- * 
- * @author cbateman
- */
-public class StringLiteralType extends LiteralType 
-{
-    private final String        _literalValue;
-    
-    /**
-     * @param value
-     */
-    public StringLiteralType(String value)
-    {
-        super(TypeConstants.TYPE_STRING);
-        _literalValue = value;
-    }
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        try
-        {
-            if (T == BigInteger.class)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return BigInteger.ZERO;
-                }
-                return new BigInteger(_literalValue);
-            }
-            else if (T == BigDecimal.class)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new BigDecimal(0.0);
-                }
-                return new BigDecimal(_literalValue);
-            }
-            else if (T == Double.class || T == Double.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new Double(0.0);
-                }
-           
-                return Double.valueOf(_literalValue);
-            }
-            else if (T == Float.class || T == Float.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new Float(0.0);
-                }
-                return Float.valueOf(_literalValue);
-            }
-            else if (T == Long.class || T == Long.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Long.valueOf(0L);
-                }
-                return Long.valueOf(_literalValue);
-            }
-            else if (T == Integer.class || T == Integer.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Integer.valueOf(0);
-                }
-                return Integer.valueOf(_literalValue);
-            }
-            else if (T == Short.class || T == Short.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Short.valueOf((short)0);
-                }
-                return Short.valueOf(_literalValue);
-            }
-            else if (T == Byte.class || T == Byte.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Byte.valueOf((byte)0);
-                }
-                return Byte.valueOf(_literalValue);
-            }
-            else
-            {
-                throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-            }
-        }
-        catch (NumberFormatException nfe)
-        {
-            throw new TypeCoercionException(nfe);
-        }
-    }
-
-    public String getLiteralValue() 
-    {
-        return _literalValue;
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return _literalValue;
-    }
-
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        // JSP.2.8.5
-        return Boolean.valueOf(_literalValue);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.java
deleted file mode 100644
index fa75a12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Coercer for simple type signatures
- * 
- * @author cbateman
- *
- */
-public class TypeCoercer 
-{
-    
-    /**
-     * Based on JSP.2.8.3 in JSP 2.0 specification
-     * 
-     * @param boxedTypeSignature -- an auto-boxed type signature
-     * @return the coerced type or null if cannot be resolved.  No unboxing
-     * is performed on the return.
-     * @throws TypeCoercionException if boxedTypeSignature is
-     */
-    public static String coerceToNumber(final String boxedTypeSignature)
-                             throws TypeCoercionException
-    {
-        String boxedTypeSignature_ = boxedTypeSignature;
-        
-        // can't coerce arrays to numbers
-        if (Signature.getTypeSignatureKind(boxedTypeSignature_)
-                == Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            throw new TypeCoercionException("Cannot coerce arrays to numbers"); //$NON-NLS-1$
-        }
-        // if it's character, pre-coerce to short per step 2
-        if (TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedTypeSignature))
-        {
-            boxedTypeSignature_ = TypeConstants.TYPE_BOXED_SHORT;
-        }
-
-        if (TypeCoercer.typeIsNumeric(boxedTypeSignature_)
-                || TypeCoercer.typeIsNull(boxedTypeSignature_))
-        {
-            return boxedTypeSignature_;
-        }
-        else if (typeIsString(boxedTypeSignature_))
-        {
-            // undetermined a string may or not resolve to a number
-            // depending on its runtime value
-            return null;
-        }
-        else
-        {
-            throw new TypeCoercionException();
-        }
-    }
-    
-    /**
-     * @param boxedTypeSignature
-     * @return true if type can be coerced to boolean; null if indeterminate
-     */
-    public static boolean canCoerceToBoolean(String boxedTypeSignature)
-    {
-        // JSP.2.8.5 -- boolean is always boolean; string is converted by Boolean.valueOf(String)
-        if (typeIsBoolean(boxedTypeSignature)
-                || typeIsString(boxedTypeSignature)
-                || typeIsNull(boxedTypeSignature))
-        {
-            return true;
-        }
-        // nothing else really convertible besides null
-        return false;
-    }
-    
-    /**
-     * @param typeSignature -- boxed type signature
-     * @return true if the typeSignature is numeric
-     */
-    public static boolean typeIsNumeric(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_BOXED_BYTE.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_SHORT.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_INTEGER.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_LONG.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_FLOAT.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_DOUBLE.equals(typeSignature) ||
-                TypeConstants.TYPE_BIG_INTEGER.equals(typeSignature) ||
-                TypeConstants.TYPE_BIG_DOUBLE.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature
-     * @return true if the typeSignature represents a String
-     */
-    public static boolean typeIsString(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_STRING.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature -- boxed type signature
-     * @return true if the typeSignature represents a boxed boolean
-     */
-    public static boolean typeIsBoolean(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_BOXED_BOOLEAN.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature
-     * @return true if type is the EL null type
-     */
-    public static boolean typeIsNull(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_NULL.equals(typeSignature));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java
deleted file mode 100644
index aa18bbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java
+++ /dev/null
@@ -1,58 +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.common.internal.types;
-
-/**
- * @author cbateman
- *
- */
-public class TypeCoercionException extends Exception 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException() {
-        super();
-    }
-
-    /**
-     * @param message
-     * @param cause
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    /**
-     * @param message
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(Throwable cause) {
-        super(cause);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
deleted file mode 100644
index a57a94b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
+++ /dev/null
@@ -1,292 +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.common.internal.types;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Static utility class used to compare two CompositeTypes for compatability
- * 
- * @author cbateman
- * 
- */
-public final class TypeComparator {
-    private static class SignatureTestResult {
-        /**
-         * the diagnostic
-         */
-        private final Diagnostic diagnostic;
-        /**
-         * Measure of the probability that the tested signatures were meant to
-         * match. Larger value means higher probability.
-         */
-        private final int matchQuality;
-
-        /**
-         * @param diagnostic
-         * @param matchQuality -
-         *            Measure of the probability that the tested signatures were
-         *            meant to match. Larger value means higher probability.
-         */
-        public SignatureTestResult(final Diagnostic diagnostic,
-                final int matchQuality) {
-            super();
-            this.diagnostic = diagnostic;
-            this.matchQuality = matchQuality;
-        }
-    }
-
-    private final TypeComparatorDiagnosticFactory   _factory;
-
-    /**
-     * Default Constructor
-     * @param factory 
-     */
-    public TypeComparator(final TypeComparatorDiagnosticFactory factory) 
-    {
-        _factory = factory;
-    }
-
-    /**
-     * @param firstType
-     * @param secondType
-     * @return true if firstType is assignable to secondType or vice-versa,
-     *         depending on their assignment and runtime types
-     */
-    public Diagnostic calculateTypeCompatibility(
-            final CompositeType firstType, final CompositeType secondType) {
-        // first, box all primitives
-        final CompositeType boxedFirstType = TypeTransformer
-                .transformBoxPrimitives(firstType);
-        final CompositeType boxedSecondType = TypeTransformer
-                .transformBoxPrimitives(secondType);
-
-        final String[] mustBeSatisfied = boxedFirstType.getSignatures();
-        final String[] testSignatures = boxedSecondType.getSignatures();
-        List<String> mustbeMethods = Collections.emptyList();
-        List<String> mustbeTypes = Collections.emptyList();
-        for (final String mustbeSignature : mustBeSatisfied) {
-            if (TypeUtil.isMethodSignature(mustbeSignature)) {
-                if (mustbeMethods.isEmpty()) {
-                    mustbeMethods = new ArrayList<String>(mustbeSignature
-                            .length());
-                }
-                mustbeMethods.add(mustbeSignature);
-            } else {
-                if (mustbeTypes.isEmpty()) {
-                    mustbeTypes = new ArrayList<String>(mustbeSignature
-                            .length());
-                }
-                mustbeTypes.add(mustbeSignature);
-            }
-        }
-        final boolean mustbeWriteable = firstType.isLHS();
-        SignatureTestResult bestResult = null;
-        for (final String isSignature : testSignatures) {
-            SignatureTestResult testResult;
-            if (TypeUtil.isMethodSignature(isSignature)) {
-                testResult = checkMethodSignature(isSignature, mustbeTypes,
-                        mustbeMethods);
-                if (testResult.diagnostic.getSeverity() == Diagnostic.OK) {
-                    return testResult.diagnostic;
-                }
-            } else {
-                testResult = checkTypeSignature(isSignature, mustbeTypes,
-                        mustbeMethods, mustbeWriteable);
-                if (testResult.diagnostic.getSeverity() == Diagnostic.OK) {
-                    return checkAssignability(firstType, secondType);
-                }
-            }
-            if (bestResult == null
-                    || bestResult.matchQuality < testResult.matchQuality) {
-                bestResult = testResult;
-            }
-        }
-        // TODO: bestResult empty? (should not happen, but who knows...
-        return bestResult.diagnostic;
-    }
-
-    private SignatureTestResult checkTypeSignature(
-            final String isSignature, final List<String> mustbeTypes,
-            final List<String> mustbeMethods, final boolean mustbeWriteable) {
-        if (mustbeTypes.isEmpty()) {
-            final Diagnostic diag = _factory.create_METHOD_EXPRESSION_EXPECTED();
-            return new SignatureTestResult(diag, 0);
-        }
-        for (final String mustbeSignature : mustbeTypes) {
-            if (mustbeSignature.equals(isSignature)
-                    || canCoerce(isSignature, mustbeSignature, mustbeWriteable)) {
-                final Diagnostic diag = Diagnostic.OK_INSTANCE;
-                return new SignatureTestResult(diag, 5);
-            }
-        }
-        final String[] params = new String[2];
-        params[0] = readableSignatures(mustbeTypes);
-        params[1] = Signature.toString(isSignature);
-        final Diagnostic diag = _factory.create_INCOMPATIBLE_TYPES(params);
-        return new SignatureTestResult(diag, 1);
-    }
-
-    private SignatureTestResult checkMethodSignature(
-            final String isSignature, final List<String> mustbeTypes,
-            final List<String> mustbeMethods) {
-        if (mustbeMethods.isEmpty()) {
-            final Diagnostic diag = _factory.create_VALUE_EXPRESSION_EXPECTED();
-            return new SignatureTestResult(diag, 0);
-        }
-        for (final String mustbeSignature : mustbeMethods) {
-            if (methodSignaturesMatch(mustbeSignature, isSignature)) {
-                final Diagnostic diag = Diagnostic.OK_INSTANCE;
-                return new SignatureTestResult(diag, 5);
-            }
-        }
-        final String[] params = new String[2];
-        params[0] = readableSignatures(mustbeMethods);
-        params[1] = Signature
-                .toString(isSignature, "method", null, false, true); //$NON-NLS-1$
-        final Diagnostic diag = _factory.create_INCOMPATIBLE_METHOD_TYPES(params);
-        return new SignatureTestResult(diag, 1);
-    }
-
-    private static String readableSignatures(final List<String> signatures) {
-        StringBuilder res = null;
-        for (final String sig : signatures) {
-            String sigText;
-            if (TypeUtil.isMethodSignature(sig)) {
-                sigText = Signature.toString(sig, "method", null, false, true); //$NON-NLS-1$
-            } else {
-                sigText = Signature.toString(sig);
-            }
-            if (res == null) {
-                res = new StringBuilder(sigText);
-            } else {
-                res.append(", ").append(sigText); //$NON-NLS-1$
-            }
-        }
-        return res != null ? res.toString() : "[no signature]"; //$NON-NLS-1$
-    }
-
-    private static boolean canCoerce(final String testType,
-            final String checkType, final boolean checkTypeIsWritable) {
-        boolean canCoerce = canCoerce(testType, checkType);
-
-        // if the check type is writable, we need to be sure that the
-        // coercion can work in both directions
-        if (canCoerce && checkTypeIsWritable) {
-            // reverse roles: can checkType assign back to test type?
-            canCoerce &= canCoerce(checkType, testType);
-        }
-
-        return canCoerce;
-    }
-
-    private static boolean canCoerce(final String testType,
-            final String checkType) {
-        // can always to coerce to string or object
-        if (TypeCoercer.typeIsString(checkType)/*
-                || TypeConstants.TYPE_JAVAOBJECT.equals(checkType)*/) 
-        {
-            return true;
-        } else if (TypeCoercer.typeIsNumeric(checkType)) {
-            return canCoerceNumeric(testType);
-        } else if (TypeCoercer.typeIsBoolean(checkType)) {
-            return TypeCoercer.canCoerceToBoolean(testType);
-        }
-
-        // otherwise, no type coercion available
-        return false;
-    }
-
-    private static boolean canCoerceNumeric(final String testType) {
-        try {
-            TypeCoercer.coerceToNumber(testType);
-            // TODO: there is a case when coerceToNumber returns
-            // null meaning "not sure", that we may want to handle
-            // differently, with a warning
-            return true;
-        } catch (final TypeCoercionException tce) {
-            // outright failure -- can't coerce
-            return false;
-        }
-    }
-
-    private static boolean methodSignaturesMatch(final String firstMethodSig,
-            final String secondMethodSig) {
-        // TODO: need to account for primitive type coercions
-        if (firstMethodSig.equals(secondMethodSig)) {
-            return true;
-        }
-        final String[] firstMethodParams = Signature
-                .getParameterTypes(firstMethodSig);
-        final String[] secondMethodParams = Signature
-                .getParameterTypes(secondMethodSig);
-
-        // fail fast if param count doesn't match
-        if (firstMethodParams.length != secondMethodParams.length) {
-            return false;
-        }
-
-        // now check each parameter
-        for (int i = 0; i < firstMethodParams.length; i++) {
-            // need to box primitives before comparing
-            final String firstMethodParam = TypeTransformer
-                    .transformBoxPrimitives(firstMethodParams[i]);
-            final String secondMethodParam = TypeTransformer
-                    .transformBoxPrimitives(secondMethodParams[i]);
-
-            if (!firstMethodParam.equals(secondMethodParam)) {
-                return false;
-            }
-        }
-
-        // if we get to here then we need only check the return type
-        final String firstReturn = TypeTransformer
-                .transformBoxPrimitives(Signature.getReturnType(firstMethodSig));
-        final String secondReturn = TypeTransformer
-                .transformBoxPrimitives(Signature
-                        .getReturnType(secondMethodSig));
-
-        if (!firstReturn.equals(secondReturn)) {
-            return false;
-        }
-
-        // if we get to here, then everything checks out
-        return true;
-    }
-
-    /**
-     * Precond: both firstType and secondType must represent value bindings.
-     * 
-     * @param firstType
-     * @param secondType
-     * @return a diagnostic validating that the two composite have compatible
-     *         assignability
-     */
-    private Diagnostic checkAssignability(final CompositeType firstType,
-            final CompositeType secondType) {
-        if (firstType.isRHS() && !secondType.isRHS()) {
-            return _factory.create_PROPERTY_NOT_READABLE();
-        }
-
-        if (firstType.isLHS() && !secondType.isLHS()) {
-            return _factory.create_PROPERTY_NOT_WRITABLE();
-        }
-
-        return Diagnostic.OK_INSTANCE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorDiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorDiagnosticFactory.java
deleted file mode 100644
index 8dfffa0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorDiagnosticFactory.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.internal.types;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Diagnostic Factory for type comparator diagnostics.
- * 
- * @author cbateman
- * 
- */
-public final class TypeComparatorDiagnosticFactory
-{
-    /**
-     * The id used in the source field of all Diagnostic's created by this
-     * factory to uniquely identify TypeComparator validation as their source
-     * type.
-     */
-    public final static String SOURCE_IDENTIFIER                     = "org.eclipse.jst.jsf.common.types.TypeComparator"; //$NON-NLS-1$
-
-    /**
-     * A method expression was expected, but something else (i.e. a value
-     * expression) was provided.
-     */
-    public final static int    METHOD_EXPRESSION_EXPECTED_ID = 0;
-
-    /**
-     * Value expression type was incompatible with the expected type.
-     */
-    public static final int    INCOMPATIBLE_TYPES_ID         = 1;
-
-    /**
-     * A value expression was expected, but something else (i.e. a method
-     * expression) was provided.
-     */
-    public static final int    VALUE_EXPRESSION_EXPECTED_ID  = 2;
-
-    /**
-     * Method expression signature did not match what was expected.
-     */
-    public static final int    INCOMPATIBLE_METHOD_TYPES_ID  = 3;
-
-    /**
-     * A property was expected to be readable but no getter was found.
-     */
-    public static final int    PROPERTY_NOT_READABLE_ID      = 4;
-
-    /**
-     * A property was expected to be writable but no setter was found
-     */
-    public static final int    PROPERTY_NOT_WRITABLE_ID      = 5;
-    
-    /**
-     * the number of diagnostic ids
-     */
-    public static final int    NUM_IDS = 6;
-
-    private final TypeComparatorPreferences _prefs;
-
-    /**
-     * @param prefs
-     */
-    public TypeComparatorDiagnosticFactory(final TypeComparatorPreferences prefs)
-    {
-        _prefs = prefs;
-    }
-    // A method expression was supplied as expected, but its signature did
-    // * not match the expected.
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_METHOD_EXPRESSION_EXPECTED()
-    {
-        return create(METHOD_EXPRESSION_EXPECTED_ID, Messages
-                .getString("TypeComparator.Expression.No_Method")); //$NON-NLS-1$
-    }
-
-    /**
-     * @param params
-     * @return a diagnostic
-     */
-    public Diagnostic create_INCOMPATIBLE_TYPES(final Object[] params)
-    {
-        return create(
-                INCOMPATIBLE_TYPES_ID,
-                NLS
-                        .bind(
-                                Messages
-                                        .getString("TypeComparator.Expression.Incompatible_Value"), params)); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_VALUE_EXPRESSION_EXPECTED()
-    {
-        return create(VALUE_EXPRESSION_EXPECTED_ID, Messages
-                .getString("TypeComparator.Expression.No_Value"));
-    }
-
-    /**
-     * @param params
-     * @return a diagnostic
-     */
-    public Diagnostic create_INCOMPATIBLE_METHOD_TYPES(final Object[] params)
-    {
-        return create(INCOMPATIBLE_METHOD_TYPES_ID, NLS.bind(Messages
-                .getString("TypeComparator.Expression.Incompatible_Method"),
-                params));
-    }
-
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_PROPERTY_NOT_READABLE()
-    {
-        return create(PROPERTY_NOT_READABLE_ID, Messages
-                .getString("TypeComparator.Expression.Not.Gettable")); //$NON-NLS-1$
-    }
-
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_PROPERTY_NOT_WRITABLE()
-    {
-        return create(PROPERTY_NOT_WRITABLE_ID, Messages
-                .getString("TypeComparator.Expression.Expected.Settable")); //$NON-NLS-1$
-    }
-
-    private BasicDiagnostic create(int diagnosticId, String message)
-    {
-        final int severity = _prefs.getDefaultSeverity(diagnosticId);
-        return new BasicDiagnostic(severity, SOURCE_IDENTIFIER, diagnosticId, message,
-                null);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorPreferences.java
deleted file mode 100644
index 412b22a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparatorPreferences.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.common.internal.types;
-
-import org.eclipse.emf.common.util.Diagnostic;
-
-/**
- * Preference info for type comparator diagnostics
- * 
- * @author cbateman
- *
- */
-public class TypeComparatorPreferences
-{
-
-    /**
-     * @param diagnosticId
-     * @return the default severity of a diagnostic
-     */
-    public int getDefaultSeverity(final int diagnosticId)
-    {
-        switch (diagnosticId)
-        {
-            case TypeComparatorDiagnosticFactory.METHOD_EXPRESSION_EXPECTED_ID:
-                return Diagnostic.ERROR;
-            case TypeComparatorDiagnosticFactory.INCOMPATIBLE_TYPES_ID:
-                return Diagnostic.WARNING;
-            case TypeComparatorDiagnosticFactory.VALUE_EXPRESSION_EXPECTED_ID:
-                return Diagnostic.ERROR;
-            case TypeComparatorDiagnosticFactory.INCOMPATIBLE_METHOD_TYPES_ID:
-                return Diagnostic.ERROR;
-            case TypeComparatorDiagnosticFactory.PROPERTY_NOT_READABLE_ID:
-                return Diagnostic.WARNING;
-            case TypeComparatorDiagnosticFactory.PROPERTY_NOT_WRITABLE_ID:
-                return Diagnostic.WARNING;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: "+ diagnosticId +" is out of range");
-
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.java
deleted file mode 100644
index e237825..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.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.common.internal.types;
-
-/**
- * @author cbateman
- *
- */
-public class TypeConstants 
-{
-    /**
-     * we overload "void" to represent null
-     */
-    public final static String  TYPE_NULL = "V"; //$NON-NLS-1$
-    /**
-     * unboxed boolean 
-     */
-    public final static String  TYPE_BOOLEAN = "Z"; //$NON-NLS-1$
-    /**
-     * string type
-     */
-    public final static String   TYPE_STRING = "Ljava.lang.String;"; //$NON-NLS-1$
-    /**
-     * big integer
-     */
-    public final static String   TYPE_BIG_INTEGER = "Ljava.math.BigInteger;"; //$NON-NLS-1$
-    
-    /**
-     * big double
-     */
-    public final static String   TYPE_BIG_DOUBLE = "Ljava.math.BigDecimal;"; //$NON-NLS-1$
-    
-    /* boxed types */
-    /**
-     * Boxed byte
-     */
-    public final static String   TYPE_BOXED_BYTE = "Ljava.lang.Byte;"; //$NON-NLS-1$
-    /**
-     * Boxed short
-     */
-    public final static String   TYPE_BOXED_SHORT = "Ljava.lang.Short;"; //$NON-NLS-1$
-    /**
-     * Boxed int
-     */
-    public final static String   TYPE_BOXED_INTEGER = "Ljava.lang.Integer;"; //$NON-NLS-1$
-    /**
-     * Boxed long
-     */
-    public final static String   TYPE_BOXED_LONG = "Ljava.lang.Long;"; //$NON-NLS-1$
-    /**
-     * Boxed float
-     */
-    public final static String   TYPE_BOXED_FLOAT = "Ljava.lang.Float;"; //$NON-NLS-1$
-    /**
-     * Boxed double
-     */
-    public final static String   TYPE_BOXED_DOUBLE = "Ljava.lang.Double;"; //$NON-NLS-1$
-    /**
-     * Boxed boolean 
-     */
-    public final static String   TYPE_BOXED_BOOLEAN = "Ljava.lang.Boolean;"; //$NON-NLS-1$
-    /**
-     * Boxed char 
-     */
-    public final static String   SIGNATURE_BOXED_CHARACTER = "Ljava.lang.Character"; //$NON-NLS-1$
-    /**
-     * Map type
-     */
-    public final static String   TYPE_MAP = "Ljava.util.Map;"; //$NON-NLS-1$
-    /**
-     * Collection type
-     */
-    public final static String   TYPE_COLLECTION = "Ljava.util.Collection;"; //$NON-NLS-1$
-    /**
-     * Comparable type
-     */
-    public final static String   TYPE_COMPARABLE = "Ljava.lang.Comparable;"; //$NON-NLS-1$
-    
-    /**
-     * List type
-     */
-    public final static String   TYPE_LIST = "Ljava.util.List;"; //$NON-NLS-1$
-    
-    /**
-     * java.lang.Object type signature
-     */
-    public static final String TYPE_JAVAOBJECT = "Ljava.lang.Object;"; //$NON-NLS-1$
-    /**
-     * Type signature for the JSF Data Model type
-     */
-    public static final String TYPE_DATA_MODEL = "Ljavax.faces.model.DataModel;"; //$NON-NLS-1$
-    /**
-     * Type signature for the Result Set type
-     */
-    public static final String TYPE_RESULT_SET = "Ljava.sql.ResultSet;"; //$NON-NLS-1$
-    /**
-     * Type signature for the JSTL ResultSet type
-     */
-    public static final String TYPE_JAVAX_SERVLET_JSP_JSTL_SQL_RESULT = "Ljavax.servlet.jsp.jstl.sql.Result;"; //$NON-NLS-1$
-    /**
-     * Type signature of the base type of all enum types
-     */
-    public static final String TYPE_ENUM_BASE = "Ljava.lang.Enum;";  // $NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.java
deleted file mode 100644
index d514f42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.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.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-
-/**This class contains all info that is cached for a given IType.
- * @see org.eclipse.jst.jsf.common.internal.types.TypeInfoCache
- * 
- * @author Matthias
- */
-class TypeInfo {
-    
-    /**Empty String array. Used for the (usual) case when a type has no missing supertypes.
-     */
-    public static String[] NO_NAMES = new String[0];
-
-    private IBeanMethodSymbol[] methods = null;
-    private IBeanPropertySymbol[] properties = null;
-    private IType[] supertypes = null;
-    private IType[] interfaceTypes = null;
-    private String[] missingSupertypeNames = null;
-    
-    /**Creates an empty TypeInfo object
-     */
-    public TypeInfo() {
-        super();
-    }
-    
-    /**Returns the method symbols. Returns <code>null</code> if none have been cached.
-     * @return the method symbols. May be null.
-     */
-    public IBeanMethodSymbol[] getMethodSymbols() {
-        return methods;
-    }
-    
-    /**Returns the property symbols. Returns <code>null</code> if none have been cached.
-     * @return the property symbols. May be null.
-     */
-    public IBeanPropertySymbol[] getPropertySymbols() {
-        return properties;
-    }
-
-    /**Sets the methods symbols to be cached.
-     * @param methods - the method symbols
-     */
-    public void setMethodSymbols(IBeanMethodSymbol[] methods) {
-        this.methods = methods;
-    }
-
-    /**Sets the property symbols to be cached.
-     * @param properties - the property symbols
-     */
-    public void setPropertySymbols(IBeanPropertySymbol[] properties) {
-        this.properties = properties;
-    }
-
-    /**Returns the supertypes. Returns <code>null</code> if none have been cached.
-     * @return the supertypes. May be null.
-     */
-    public IType[] getSupertypes() {
-        return supertypes;
-    }
-
-    /**Sets the supertypes to be cached.
-     * @param superTypes - the property symbols
-     */
-    public void setSupertypes(IType[] superTypes) {
-        this.supertypes = superTypes;
-    }
-
-    /**Returns the interface types. Returns <code>null</code> if none have been cached.
-     * @return the interface types. May be null.
-     */
-    public IType[] getInterfaceTypes() {
-        return interfaceTypes;
-    }
-
-    /**Sets the interface types to be cached.
-     * @param interfaceTypes - the property symbols
-     */
-    public void setInterfaceTypes(IType[] interfaceTypes) {
-        this.interfaceTypes = interfaceTypes;
-    }
-
-    /**Returns the names of the missing supertypes. Returns <code>null</code> if none have been cached.
-     * @return the names of the missing supertypes. May be null.
-     */
-    public String[] getMissingSupertypeNames() {
-        return missingSupertypeNames;
-    }
-
-    /**Sets the supertypes to be cached.
-     * @param missingSupertypeNames - the names of the missing supertypes
-     */
-    public void setMissingSupertypeNames(String[] missingSupertypeNames) {
-        this.missingSupertypeNames = missingSupertypeNames;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java
deleted file mode 100644
index c58f31c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java
+++ /dev/null
@@ -1,603 +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.internal.types;
-
-import java.util.ArrayList;
-import java.util.Collection;
-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 org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-
-/**Provides a cache for java IType properties. It can cache bean property symbols, method symbols,
- * supertypes and implemented interfaces per IType. The cache listens to changes in the java model
- * and invalidates affected properties, but does not update them.
- * 
- * @author Matthias
- */
-public class TypeInfoCache implements IElementChangedListener {
-    
-    private static TypeInfoCache instance = null;
-    
-    /**Returns the TypeInfoCache instance.  This instance is considered
-     * protected and must not be disposded with disposeInstance.
-     * 
-     * @return the TypeInfoCache instance
-     */
-    public static synchronized TypeInfoCache getInstance() {
-        if (instance == null) {
-            instance = createNewInstance();
-        }
-        return instance;
-    }
-    
-    /**
-     * Create a new instance of the type cache.
-     * 
-     * @return a new instance of the type info cache.
-     */
-    public static TypeInfoCache createNewInstance()
-    {
-        final TypeInfoCache newCache = new TypeInfoCache();
-        JavaCore.addElementChangedListener(newCache, ElementChangedEvent.POST_CHANGE);
-        return newCache;
-    }
-    
-    /**
-     * If cache is not the singleton instance acquired with {@link #getInstance()}
-     * then the cache will be disposed and should not be used.  If cache is
-     * protected instance, then nothing will happen (the singleton instance
-     * cannot be disposed).
-     * 
-     * @param cache
-     */
-    public static void disposeInstance(final TypeInfoCache cache)
-    {
-        if (cache != null 
-                && cache != instance)        
-        {
-            JavaCore.removeElementChangedListener(cache);
-            
-            synchronized(cache)
-            {
-                if (cache.cachedInfo != null)
-                {
-                    cache.cachedInfo.clear();
-                }
-                
-                if (cache.cachedTypesByAffectingTypeRoot != null)
-                {
-                    cache.cachedTypesByAffectingTypeRoot.clear();
-                }
-                
-                if (cache.cachedTypesByMissingSupertypename != null)
-                {
-                    cache.cachedTypesByMissingSupertypename.clear();
-                }
-            }
-        }
-    }
-    
-    private final Map<IType, TypeInfo> cachedInfo;
-    private final Map<ITypeRoot, Set<IType>> cachedTypesByAffectingTypeRoot;
-    private final Map<String, Set<IType>> cachedTypesByMissingSupertypename;
-    
-    private TypeInfoCache() {
-        cachedInfo = new HashMap<IType, TypeInfo>();
-        cachedTypesByAffectingTypeRoot = new HashMap();
-        cachedTypesByMissingSupertypename = new HashMap(10);
-    }
-
-    public void elementChanged(ElementChangedEvent event) {
-        updateChangedJavaElement(event.getDelta());
-    }
-    
-    /**Returns the cached info({@link TypeInfo}) for a given type. Will
-     * return <code>null</code> if no info has been cached or the the type/something it depends on
-     * has changed since then.
-     * 
-     * @param type - the type in question
-     * @return a TypeInfo instance that contains all cached info for the given type. May be null.  
-     */
-    protected TypeInfo getTypeInfo(IType type) {
-        TypeInfo info = null;
-        if (type != null)
-        {
-            info = cachedInfo.get(type);
-        }
-        return info;
-    }
-
-    /**Returns the cached bean property symbols for a given type. Will return null if no
-     * bean property symbols have been cached or the type/something it depends on has changed since
-     * then.
-     * @param beanType - the bean type in question
-     * @return the bean property symbols for the given type. May be null.
-     * @see TypeInfoCache#cachePropertySymbols(IType, IBeanPropertySymbol[])
-     */
-    public synchronized IBeanPropertySymbol[] getCachedPropertySymbols(IType beanType) {
-        IBeanPropertySymbol[] props = null;
-        
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(beanType);
-            if (typeInfo != null)
-            {
-                props =  typeInfo.getPropertySymbols();
-            }
-        }
-        return props;
-    }
-
-    /**Returns the cached method symbols for a given type. Will return null if no
-     * method symbols have been cached or the type/something it depends on has changed since
-     * then.
-     * @param beanType - the bean type in question
-     * @return the method symbols for the given type. May be null.
-     * @see TypeInfoCache#cacheMethodSymbols(IType, IBeanMethodSymbol[])
-     */
-    public synchronized IBeanMethodSymbol[] getCachedMethodSymbols(IType beanType) {
-        IBeanMethodSymbol[]  methods = null;
-        
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(beanType);
-            if (typeInfo != null)
-            {
-                methods =  typeInfo.getMethodSymbols();
-            }
-        }
-            
-        return methods;
-    }
-    
-    /**Returns the cached supertypes for a given type. Will return null if no supertypes
-     * have been cached for this type or if the type/something it depends on has changed since
-     * then.
-     * @param type - the bean type in question
-     * @return the supertypes for the given type. May be null.
-     * @see TypeInfoCache#cacheSupertypesFor(IType)
-     */
-    public synchronized IType[] getCachedSupertypes(IType type) {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getSupertypes();
-            }
-        }
-        
-        return types;
-    }
-    
-    /**Returns the cached implemented interfaces for a given type. Will return null if no interfaces
-     * have been cached for this type or if the type/something it depends on has changed since
-     * then.
-     * @param type - the bean type in question
-     * @return the interface types implemented by the given type. May be null.
-     * @see TypeInfoCache#cacheInterfaceTypesFor(IType)
-     */
-    public synchronized IType[] getCachedInterfaceTypes(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getInterfaceTypes(); 
-            }
-        }
-        
-        return types;
-    }
-    
-    /**Caches the given method symbols for the given type. 
-     * @param beanType - the type
-     * @param methods - the method symbols to cache
-     */
-    public synchronized void cacheMethodSymbols(IType beanType, IBeanMethodSymbol[] methods) {
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(beanType);
-            if (typeInfo != null) {
-                typeInfo.setMethodSymbols(methods);
-            }
-        }
-    }
-
-    /**Caches the given property symbols for the given type. 
-     * @param beanType - the type
-     * @param properties - the property symbols to cache
-     */
-    public synchronized void cachePropertySymbols(IType beanType, IBeanPropertySymbol[] properties) {
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(beanType);
-            if (typeInfo != null) {
-                typeInfo.setPropertySymbols(properties);
-            }
-        }
-    }
-    
-    /**Caches the supertypes for the given type. The supertypes will be calculated (and also returned)
-     * by this method.
-     * @param type - the type to cache supertypes for
-     * @return the supertypes of the given type.
-     */
-    public synchronized IType[] cacheSupertypesFor(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(type);
-            
-            if (typeInfo != null)
-            {
-                types = typeInfo.getSupertypes();
-            }
-        }
-        return types;
-    }
-
-    /**Caches the interface types for the given type. The interface types will be calculated (and also
-     * returned) by this method.
-     * @param type - the type to cache interface types for
-     * @return the interface types implemented by the given type.
-     */
-    public synchronized IType[] cacheInterfaceTypesFor(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getInterfaceTypes();
-            }
-        }
-        return types;
-    }
-
-    /**Returns the TypeInfo for the given type. If no TypeInfo exists for this type, an empty TypeInfo
-     * will be created and cached.
-     * @param type - the type in question
-     * @return the (modifyable) TypeInfo for the given type
-     */
-    protected TypeInfo getOrCreateTypeInfo(IType type) {
-        TypeInfo typeInfo = getTypeInfo(type);
-        if (typeInfo == null) {
-            try {
-                final ITypeHierarchy  hierarchy = 
-                    type.newSupertypeHierarchy(new NullProgressMonitor());
-                final IType[] supertypes = hierarchy.getAllSuperclasses(type);
-                final IType[] interfaceTypes = hierarchy.getAllInterfaces();
-                final IType[] rootClasses = hierarchy.getRootClasses();
-                List missingSupertypesList = null;
-                for (int i = 0; i < rootClasses.length; i++) {
-                    String superclassName = rootClasses[i].getSuperclassName();
-                    if (superclassName != null) {
-                        if (missingSupertypesList == null) {
-                            missingSupertypesList = new ArrayList(1);
-                        }
-                        superclassName = shortTypename(superclassName);
-                        missingSupertypesList.add(superclassName);
-                    }
-                }
-                String[] missingSupertypes = null;
-                if (missingSupertypesList != null) {
-                    missingSupertypes = (String[]) missingSupertypesList.toArray(new String[missingSupertypesList.size()]);
-                } else {
-                    missingSupertypes = TypeInfo.NO_NAMES;
-                }
-                typeInfo = new TypeInfo();
-                typeInfo.setSupertypes(supertypes);
-                typeInfo.setInterfaceTypes(interfaceTypes);
-                typeInfo.setMissingSupertypeNames(missingSupertypes);
-                cachedInfo.put(type, typeInfo);
-                registerCachedType(type, typeInfo);
-            } catch (JavaModelException e) {
-                JSFCommonPlugin.log(e);
-            }
-        }
-        return typeInfo;
-    }
-
-    /**Returns the typename fragment after the last "." (which in most cases is identical to the
-     * unqualified typename).
-     * Used only to make sure that if n1 and n2 are names of the same type
-     * shortname(n1) equals shortname(2) even if one name is qualified and one not.
-     * @param typename
-     * @return the typename fragment after the last "."
-     */
-    private String shortTypename(String typename) {
-        int pos = typename.lastIndexOf('.');
-        if (pos >= 0) {
-            typename = typename.substring(pos + 1);
-        }
-        return typename;
-    }
-    
-    /**
-     * Registers the given type for all ITypeRoot's it depends on, so that it can be uncached if
-     * one of this ITypeRoot's has changed. The type must be unregistered when it should not be watched
-     * anymore.
-     * @param type - the type
-     * @param typeInfo - TypeInfo of the given type
-     * @see TypeInfoCache#unregisterCachedType(IType, TypeInfo)
-     */
-    protected void registerCachedType(IType type, TypeInfo typeInfo) {
-        registerTypeForTypeRoot(type, type.getTypeRoot());
-        IType[] supertypes = typeInfo.getSupertypes();
-        for (int i = 0; i < supertypes.length; i++) {
-            registerTypeForTypeRoot(type, supertypes[i].getTypeRoot());
-        }
-        String[] missingSupertypeNames = typeInfo.getMissingSupertypeNames();
-        if (missingSupertypeNames != null) {
-            for (int i = 0; i < missingSupertypeNames.length; i++) {
-                registerTypeForMissingSupertype(type, missingSupertypeNames[i]);
-            }
-        }
-    }
-
-    private void registerTypeForTypeRoot(IType type, ITypeRoot typeRoot) {
-        Set dependentTypes = cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (dependentTypes == null) {
-            dependentTypes = new HashSet(5);
-            cachedTypesByAffectingTypeRoot.put(typeRoot, dependentTypes);
-        }
-        dependentTypes.add(type);
-    }
-
-    private void registerTypeForMissingSupertype(IType type, String supertype) {
-        Set dependentTypes = cachedTypesByMissingSupertypename.get(supertype);
-        if (dependentTypes == null) {
-            dependentTypes = new HashSet(5);
-            cachedTypesByMissingSupertypename.put(supertype, dependentTypes);
-        }
-        dependentTypes.add(type);
-    }
-
-    /**Unregisters the given type for all ITypeRoot's it depended on.
-     * @param type - the type
-     * @param typeInfo - TypeInfo of the given type
-     */
-    protected void unregisterCachedType(IType type, TypeInfo typeInfo) {
-        unregisterTypeForTypeRoot(type, type.getTypeRoot());
-        IType[] supertypes = typeInfo.getSupertypes();
-        for (int i = 0; i < supertypes.length; i++) {
-            unregisterTypeForTypeRoot(type, supertypes[i].getTypeRoot());
-        }
-        String[] missingSupertypeNames = typeInfo.getMissingSupertypeNames();
-        if (missingSupertypeNames != null) {
-            for (int i = 0; i < missingSupertypeNames.length; i++) {
-                unregisterTypeForMissingSupertype(type, missingSupertypeNames[i]);
-            }
-        }
-    }
-
-    private void unregisterTypeForTypeRoot(IType type, ITypeRoot typeRoot) {
-        Set dependentTypes = cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (dependentTypes != null) {
-            dependentTypes.remove(type);
-            if (dependentTypes.isEmpty()) {
-                cachedTypesByAffectingTypeRoot.remove(typeRoot);
-            }
-        }
-    }
-    
-    private void unregisterTypeForMissingSupertype(IType type, String supertype) {
-        Set dependentTypes = cachedTypesByMissingSupertypename.get(supertype);
-        if (dependentTypes != null) {
-            dependentTypes.remove(type);
-            if (dependentTypes.isEmpty()) {
-                cachedTypesByMissingSupertypename.remove(supertype);
-            }
-        }
-    }
-    
-    /**This will remove all cached info for all types.
-     */
-    protected synchronized void uncacheAllTypes() {
-        cachedInfo.clear();
-        cachedTypesByAffectingTypeRoot.clear();
-        cachedTypesByMissingSupertypename.clear();
-    }
-    
-    /**Removes all cached info for all types that are subtypes of a type of the given ITypeRoot. 
-     * @param typeRoot
-     */
-    protected synchronized void uncacheAffectedTypes(ITypeRoot typeRoot) {
-        Collection affectedTypes = cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (affectedTypes != null && !affectedTypes.isEmpty()) {
-            List affectedTypesCopy = new ArrayList(affectedTypes);
-            for (Iterator it = affectedTypesCopy.iterator(); it.hasNext(); ) {
-                IType cachedType = (IType) it.next();
-                TypeInfo typeInfo = cachedInfo.remove(cachedType);
-                unregisterCachedType(cachedType, typeInfo);
-            }
-        }
-    }
-    
-    /**Removes all cached info for all types (or subtypes of types) that specify a supertype
-     * that has a name similar to the given name. 
-     * @param supertypename - the missing supertype name. May be qualified or not
-     */
-    protected synchronized void uncacheTypesWithMissingSupertype(String supertypename) {
-        Collection affectedTypes = cachedTypesByMissingSupertypename.get(shortTypename(supertypename));
-        if (affectedTypes != null && !affectedTypes.isEmpty()) {
-            List affectedTypesCopy = new ArrayList(affectedTypes);
-            for (Iterator it = affectedTypesCopy.iterator(); it.hasNext(); ) {
-                IType cachedType = (IType) it.next();
-                TypeInfo typeInfo = cachedInfo.remove(cachedType);
-                unregisterCachedType(cachedType, typeInfo);
-            }
-        }
-    }
-    
-    /**Removes all cached info that may be affected by the given change.
-     * @param delta - the change in the java model
-     */
-    protected void updateChangedJavaElement(IJavaElementDelta delta) {
-        IJavaElement element= delta.getElement();
-        switch (element.getElementType()) {
-            case IJavaElement.JAVA_MODEL:
-                updateChangedJavaModel(delta, element);
-                break;
-            case IJavaElement.JAVA_PROJECT:
-                updateChangedJavaProject(delta, element);
-                break;
-            case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-                updateChangedPackageFragmentRoot(delta, element);
-                break;
-            case IJavaElement.PACKAGE_FRAGMENT:
-                updateChangedPackageFragment(delta, (IPackageFragment) element);
-                break;
-            case IJavaElement.CLASS_FILE:
-            case IJavaElement.COMPILATION_UNIT:
-                updateChangedOpenable(delta, element);
-                break;
-        }
-    }
-    
-    private void updateChangedChildren(IJavaElementDelta delta) {
-        if ((delta.getFlags() & IJavaElementDelta.F_CHILDREN) > 0) {
-            IJavaElementDelta[] children= delta.getAffectedChildren();
-            for (int i= 0; i < children.length; i++) {
-                updateChangedJavaElement(children[i]);
-            }
-        }
-    }
-
-    private void updateChangedJavaModel(IJavaElementDelta delta, IJavaElement element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                updateChangedChildren(delta);
-                break;
-        }
-    }
-
-    private void updateChangedJavaProject(IJavaElementDelta delta, IJavaElement element) {
-        int kind = delta.getKind();
-        int flags = delta.getFlags();
-        if ((flags & IJavaElementDelta.F_OPENED) != 0) {
-            kind = IJavaElementDelta.ADDED; // affected in the same way
-        }
-        if ((flags & IJavaElementDelta.F_CLOSED) != 0) {
-            kind = IJavaElementDelta.REMOVED; // affected in the same way
-        }
-        switch (kind) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                updateChangedChildren(delta);
-                break;
-        }
-    }
-
-   private void updateChangedPackageFragment(IJavaElementDelta delta, IPackageFragment element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-                // if the package fragment is in the projects being considered, this could
-                // introduce new types, changing the hierarchy
-            case IJavaElementDelta.REMOVED :
-                // is a change if the package fragment contains supertypes?
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                // look at the files in the package fragment
-                updateChangedChildren(delta);
-        }
-    }
-
-    private void updateChangedPackageFragmentRoot(IJavaElementDelta delta, IJavaElement element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                int flags = delta.getFlags();
-                if (((flags & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0)||(flags & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) > 0) {
-                    uncacheAllTypes();
-                } else {
-                    updateChangedChildren(delta);
-                }
-                break;
-        }
-    }
-
-    /**Removes all cached info that may be affected by the change in this IOpenable
-     * @param delta - the change in the java model
-     * @param element - the (changed) IOpenable considered
-     */
-    protected void updateChangedOpenable(IJavaElementDelta delta, IJavaElement element) {
-        if (element instanceof ITypeRoot) {
-            ITypeRoot typeRoot = (ITypeRoot) element;
-            uncacheAffectedTypes(typeRoot);
-            // Creates missing superclass for any cached type?
-            if (delta.getKind() == IJavaElementDelta.ADDED) {
-                if (typeRoot instanceof ICompilationUnit) {
-                    ICompilationUnit cu = (ICompilationUnit) typeRoot;
-                    try {
-                        IType[] types = cu.getAllTypes();
-                        for (int i = 0; i < types.length; i++) {
-                            uncacheTypesWithMissingSupertype(types[i].getElementName());
-                        }
-                    } catch (JavaModelException e) {
-                        if (!e.isDoesNotExist())
-                        {
-                            JSFCommonPlugin.log(IStatus.INFO, "Unable to get types for compilation unit " + cu, e); //$NON-NLS-1$
-                        }
-                        uncacheAllTypes();
-                    }
-                } else if (typeRoot instanceof IClassFile) {
-                    IClassFile cf = (IClassFile) typeRoot;
-                    IType type = cf.getType();
-                    uncacheTypesWithMissingSupertype(type.getElementName());
-                }
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java
deleted file mode 100644
index 4c5718f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java
+++ /dev/null
@@ -1,213 +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.common.internal.types;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Transforms one CompositeType to another according to particular 
- * transform rules.
- * 
- * In general, every transformation should be of the form:
- * 
- *   CompositeType  transform(CompositeType original, other inputs...);
- * 
- * @author cbateman
- *
- */
-public class TypeTransformer 
-{
-    private final static Map  boxConversions = new HashMap();
-    private final static Map  unBoxConversions = new HashMap();
-    
-    static
-    {
-        // see jdt.core.Signature or JVM link spec for more details
-        boxConversions.put("B", "Ljava.lang.Byte;");  //$NON-NLS-1$//$NON-NLS-2$
-        boxConversions.put("C", "Ljava.lang.Character;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("D", "Ljava.lang.Double;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("F", "Ljava.lang.Float;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("I", "Ljava.lang.Integer;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("J", "Ljava.lang.Long;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("S", "Ljava.lang.Short;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("Z", "Ljava.lang.Boolean;"); //$NON-NLS-1$ //$NON-NLS-2$
-        // don't box V
-        boxConversions.put("V", "V"); //$NON-NLS-1$ //$NON-NLS-2$
-    
-        // invert hte box conversions
-        for (final Iterator it = boxConversions.keySet().iterator(); it.hasNext();)
-        {
-            final String newValue = (String) it.next();
-            final String newKey = (String) boxConversions.get(newValue);
-            if (unBoxConversions.put(newKey, newValue) != null)
-            {
-                // if put returns non-null then we have replaced a key
-                // added on a previous iteration.  This implies
-                // that box mappings are no longer one-to-one
-                throw new AssertionError("Duplicated boxing value"); //$NON-NLS-1$
-            }
-        }
-    }
-    
-    /**
-     * @param compositeType
-     * @return an equivilent form of compositeType with all primitive type
-     * signatures converted to their fully qualified boxed equivilent but
-     * otherwise unchanged.
-     * 
-     * Example:   J -> Ljava.lang.Long;
-     */
-    public static CompositeType transformBoxPrimitives(CompositeType compositeType)
-    {
-        String[] signatures = compositeType.getSignatures();
-        String[] newsignatures = new String[signatures.length];
-        
-        for (int i = 0; i < signatures.length; i++)
-        {
-            newsignatures[i] = transformBoxPrimitives(signatures[i]);
-        }
-        
-        return new CompositeType(newsignatures, compositeType.getAssignmentTypeMask());
-    }
-    
-    /**
-     * Performs boxing for a single typeSignature string
-     * @param curSignature
-     * @return the boxed signature
-     */
-    public static String transformBoxPrimitives(final String curSignature)
-    {
-        String newSignature = curSignature;
-        
-        // first determine if we have a type or method signature
-        try
-        {
-            int kind = Signature.getTypeSignatureKind(curSignature);
-            
-            // interested in base types, since these need boxing
-            if (kind == Signature.BASE_TYPE_SIGNATURE)
-            {
-                // grab the box for the primitive
-                newSignature = (String) boxConversions.get(curSignature);
-            }
-            else if (kind == Signature.ARRAY_TYPE_SIGNATURE)
-            {
-                // check if it's array of primitives
-                final String baseType = Signature.getElementType(curSignature);
-                
-                if (Signature.getTypeSignatureKind(baseType) == Signature.BASE_TYPE_SIGNATURE)
-                {
-                    // it is, so box it
-                    final String newBaseType = (String) boxConversions.get(baseType);
-                    final int numBraces = Signature.getArrayCount(curSignature);
-                    newSignature = ""; //$NON-NLS-1$
-                    for (int j = 0; j < numBraces; j++)
-                    {
-                        newSignature += "["; //$NON-NLS-1$
-                    }
-                    
-                    newSignature += newBaseType;
-                }
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // signature was not a type signature, so must be a method sig
-            // do nothing: don't box method types
-        }
-
-        return newSignature;
-    }
-    
-    /**
-     * Performs the exact inverse of transformBoxPrimitives -- takes all
-     * boxing type signatures and replaces them with their primitive equivilent
-     * @param compositeType
-     * @return a new composite with all boxed primitives unboxed
-     */
-    public static CompositeType transformUnboxPrimitives(CompositeType compositeType)
-    {
-        String[] signatures = compositeType.getSignatures();
-        String[] newsignatures = new String[signatures.length];
-        
-        for (int i = 0; i < signatures.length; i++)
-        {
-            newsignatures[i] = transformUnboxPrimitives(signatures[i]);
-        }
-        
-        return new CompositeType(newsignatures, compositeType.getAssignmentTypeMask());
-    }
-    
-    /**
-     * Performs unboxing for a single typeSignature string
-     * 
-     * @param typeSignature
-     * @return the transformed signature
-     */
-    public static String transformUnboxPrimitives(final String typeSignature)
-    {
-        String newSignature = typeSignature;
-        
-        // first determine if we have a type or method signature
-        try
-        {
-            int kind = Signature.getTypeSignatureKind(typeSignature);
-            
-            // interested in class types, since these need boxing
-            if (kind == Signature.CLASS_TYPE_SIGNATURE)
-            {
-                // grab the box for the primitive
-                String checkForUnbox  = (String) unBoxConversions.get(typeSignature);
-                
-                if (checkForUnbox != null)
-                {
-                    newSignature = checkForUnbox;
-                }
-            }
-            else if (kind == Signature.ARRAY_TYPE_SIGNATURE)
-            {
-                // check if it's array of objects
-                final String baseType = Signature.getElementType(typeSignature);
-                
-                if (Signature.getTypeSignatureKind(baseType) == Signature.CLASS_TYPE_SIGNATURE)
-                {
-                    // it is, so unbox it
-                    final String newBaseTypeCandidate = (String) unBoxConversions.get(baseType);
-                    
-                    if (newBaseTypeCandidate != null)
-                    {
-                        final int numBraces = Signature.getArrayCount(typeSignature);
-                        newSignature = ""; //$NON-NLS-1$
-                        for (int j = 0; j < numBraces; j++)
-                        {
-                            newSignature += "["; //$NON-NLS-1$
-                        }
-                        
-                        newSignature += newBaseTypeCandidate;
-                    }
-                }
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // signature was not a type signature, so must be a method sig
-            // do nothing: don't box method types
-        }
-        
-        return newSignature;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.java
deleted file mode 100644
index a302fc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.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.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Package utility class
- * @author cbateman
- *
- */
-/*package*/final class TypeUtil 
-{
-    /**
-     * @param assignmentType
-     * @return true if assignmentType has lhs flag set
-     */
-    public static boolean matchesLHS(int assignmentType)
-    {
-        return (assignmentType & IAssignable.ASSIGNMENT_TYPE_LHS) != 0;
-    }
-    
-    /**
-     * @param assignmentType
-     * @return true if assignmentType has rhs flag set
-     */
-    public static boolean matchesRHS(int assignmentType)
-    {
-        return (assignmentType & IAssignable.ASSIGNMENT_TYPE_RHS) != 0;
-    }
-
-    /**
-     * @param signature
-     * @return true if the signature is a method signature
-     */
-    public static boolean isMethodSignature(final String signature)
-    {
-        // method signature must start with a "("
-        return signature.charAt(0) == Signature.C_PARAM_START;
-    }
-    private TypeUtil() {/*not instantiable*/}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java
deleted file mode 100644
index 2d12825..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java
+++ /dev/null
@@ -1,238 +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.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Value object representing a value binding type by it's type and assignability
- * information
- * 
- * @author cbateman
- *
- */
-public class ValueType implements SignatureBasedType, IAssignable
-{
-    /**
-     * A default empty string array
-     */
-    protected final static String[]        EMPTY_STRING_ARRAY = new String[0];
-    
-    private final String        _signature;
-    private final String[]      _typeArgs;
-    private final int           _assignmentMask;
-    private final String[]      _superTypes;
-    private final String[]      _interfaceTypes;
-    
-    private final boolean       _isEnumType;
-    
-    private String[]            _allTypes;  // lazy creation on getAllTypes
-
-    /**
-     * Construct a new ValueType object with the given
-     * signature
-     * 
-     * @param signature
-     * @param typeArgs generic type arguments for signature or empty if none
-     * @param superTypes 
-     * @param interfaceTypes 
-     * @param isEnumType 
-     * @param assignmentMask 
-     */
-    public ValueType(final String signature,
-                     final String[] typeArgs,
-                     final String[] superTypes,
-                     final String[] interfaceTypes,
-                     final boolean  isEnumType,
-                     final int assignmentMask) 
-    {
-        if (signature == null)
-        {
-            throw new AssertionError("signature can never be null"); //$NON-NLS-1$
-        }
-    
-        _signature = signature;
-        _typeArgs = typeArgs;
-        _assignmentMask = assignmentMask;
-        _superTypes = superTypes != null ? superTypes : EMPTY_STRING_ARRAY;
-        _interfaceTypes = interfaceTypes != null ? interfaceTypes : EMPTY_STRING_ARRAY;
-        _isEnumType = isEnumType;
-    }
-    
-    /**
-     * Copy constructor equivilent to 
-     * ValueType(template.getSignature(), template.getSuperTypes(), template.getInterfaceTypes(),assingmentMask, template._isEnumType)
-     * 
-     * @param template
-     * @param assignmentMask
-     */
-    public ValueType(final ValueType  template, final int assignmentMask)
-    {
-        this(template._signature, template._typeArgs, template._superTypes, 
-                template._interfaceTypes, template._isEnumType, assignmentMask);
-    }
-    
-    /**
-     * Convienence constructor for creating ValueType's with no supertype, type argument
-     * or interface info.  Equivilent to:
-     *  ValueType(signature, new String[0], new String[0], new String[0], false, assignmentMask)
-     *  
-     * @param signature
-     * @param assignmentMask
-     */
-    public ValueType(final String signature, final int assignmentMask)
-    {
-        this(signature, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, false, assignmentMask);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.SignatureBasedType#getSignature()
-     */
-    public String getSignature() 
-    {
-        return _signature;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#getAssignability()
-     */
-    public int getAssignability() {
-        return _assignmentMask;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isLHS()
-     */
-    public boolean isLHS() {
-        return TypeUtil.matchesLHS(_assignmentMask);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isRHS()
-     */
-    public boolean isRHS() {
-        return TypeUtil.matchesRHS(_assignmentMask);
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString()
-    {
-        return Signature.getSignatureSimpleName
-            (TypeTransformer.transformBoxPrimitives(_signature));
-    }
-    
-    /**
-     * @return an array of all signatures of all super types or empty
-     * array if there are no super types for this type
-     * 
-     * Note: if isArray() == true, then these are the super types of 
-     * the base element
-     */
-    public String[] getSuperTypes()
-    {
-        return _superTypes;
-    }
-    
-    /**
-     * @return an array of all interfaces implemented or empty array
-     * if none
-     * 
-     * Note: if isArray() == true, then these are the interfacess of 
-     * the base element
-     */
-    public String[] getInterfaceTypes()
-    {
-        return _interfaceTypes;
-    }
-    
-    /**
-     * @return all types including the base type, super types and interface
-     * types.
-     * 
-     * Note: if isArray() == true, then these are the super types of 
-     * the base element
-
-     */
-    public String[]  getAllTypes()
-    {
-        if (_allTypes == null)
-        {
-            int numberOfTypes = 1 + _superTypes.length + _interfaceTypes.length;
-            _allTypes = new String[numberOfTypes];
-            _allTypes[0] = _signature;
-            System.arraycopy(_superTypes, 0, _allTypes, 1, _superTypes.length);
-            System.arraycopy(_interfaceTypes, 0, _allTypes, 1+_superTypes.length, _interfaceTypes.length);
-        }
-        return _allTypes;
-    }
-    
-    /**
-     * @return the type arguments for getSignature() if any or empty array if none
-     */
-    public String[] getTypeArguments()
-    {
-        return _typeArgs;
-    }
-    
-    /**
-     * 
-     */
-    public CompositeType toCompositeType() 
-    {
-        return new CompositeType(getAllTypes(), getAssignability());
-    }
-
-    /**
-     * @param signature
-     * @return true if an instance of this type would satisfy instanceof signature
-     *  
-     */
-    public boolean isInstanceOf(final String signature)
-    {
-        // if this is an array, then the super types are for the base
-        // type and we can't be an instance of anything but signature
-        if (isArray())
-        {
-            return getSignature().equals(signature);
-        }
-        
-        final String[]  allTypes = getAllTypes();
-        
-        for (int i = 0; i < allTypes.length; i++)
-        {
-            if (allTypes[i].equals(signature))
-            {
-                return true;
-            }
-        }
-        
-        return false;
-    }
-    
-    /**
-     * @return true if this is an array type
-     */
-    public boolean isArray()
-    {
-        return Signature.getArrayCount(getSignature()) > 0;
-    }
-
-    /**
-     * @return true if the value type represents a (>=Java5) enum type
-     */
-    public boolean isEnumType() {
-        return _isEnumType;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.properties
deleted file mode 100644
index 3df119b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.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
-###############################################################################
-TypeComparator.Expression.Doesnt.Match.Expected.Types=EL expression does not evaluate to expected types for this attribute
-TypeComparator.Expression.Not.Gettable=Expression is not gettable
-TypeComparator.Expression.Expected.Settable=Attribute expects settable value, but expression is not settable
-
-TypeComparator.Expression.No_Method=Expression must be a method expression but is a value expression
-TypeComparator.Expression.No_Value=Expression must be a value expression but is a method expression
-TypeComparator.Expression.Incompatible_Method=Method must have signature "{0}" but has signature "{1}"
-TypeComparator.Expression.Incompatible_Value=Cannot coerce type {1} to {0}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java
deleted file mode 100644
index 6af707e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Entity</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.jsf.common.metadata.Entity#getChildEntities <em>Child Entities</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getTraits <em>Traits</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups <em>Include Groups</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity()
- * @model extendedMetaData="kind='element' name='entity'"
- * @generated
- */
-public interface Entity extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Child Entities</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.Entity}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Child Entities</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 Entities</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_ChildEntities()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.Entity" containment="true"
-	 *        extendedMetaData="kind='element' name='entity'"
-	 * @generated
-	 */
-	EList getChildEntities();
-
-	/**
-	 * Returns the value of the '<em><b>Traits</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.Trait}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Traits</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>Traits</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_Traits()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.Trait" containment="true"
-	 *        extendedMetaData="kind='element' name='trait'"
-	 * @generated
-	 */
-	EList getTraits();
-
-	/**
-	 * 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.common.metadata.MetadataPackage#getEntity_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Entity#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.
-	 * <!-- 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 #setType(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_Type()
-	 * @model
-	 * @generated
-	 */
-	String getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Entity#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>Include Groups</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Include Groups</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>Include Groups</em>' reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_IncludeGroups()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup"
-	 *        extendedMetaData="kind='element' name='include-entity-group'"
-	 * @generated
-	 */
-	EList getIncludeGroups();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param visitor 	 
-	 * <!-- end-user-doc -->
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor"
-	 * @generated
-	 */
-	void accept(IEntityVisitor visitor);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return Model 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	Model getModel();
-
-} // Entity
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java
deleted file mode 100644
index 09e9f73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Entity Group</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntityGroup()
- * @model
- * @generated
- */
-public interface EntityGroup extends Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-} // EntityGroup
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java
deleted file mode 100644
index be4f146..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Include Entity Group</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.jsf.common.metadata.IncludeEntityGroup#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getIncludeEntityGroup()
- * @model
- * @generated
- */
-public interface IncludeEntityGroup 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.common.metadata.MetadataPackage#getIncludeEntityGroup_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#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>Model Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Model 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>Model Uri</em>' attribute.
-	 * @see #setModelUri(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getIncludeEntityGroup_ModelUri()
-	 * @model extendedMetaData="name='uri'"
-	 * @generated
-	 */
-	String getModelUri();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Model Uri</em>' attribute.
-	 * @see #getModelUri()
-	 * @generated
-	 */
-	void setModelUri(String value);
-
-} // IncludeEntityGroup
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java
deleted file mode 100644
index 8b8ea0c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-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>NOT API</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage
- * @generated
- */
-public interface MetadataFactory 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
-	 */
-	MetadataFactory eINSTANCE = org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Trait</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Trait</em>'.
-	 * @generated
-	 */
-	Trait createTrait();
-
-	/**
-	 * Returns a new object of class '<em>Include Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Include Entity Group</em>'.
-	 * @generated
-	 */
-	IncludeEntityGroup createIncludeEntityGroup();
-
-	/**
-	 * Returns a new object of class '<em>Model</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Model</em>'.
-	 * @generated
-	 */
-	Model createModel();
-
-	/**
-	 * Returns a new object of class '<em>Entity</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity</em>'.
-	 * @generated
-	 */
-	Entity createEntity();
-
-	/**
-	 * Returns a new object of class '<em>Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Group</em>'.
-	 * @generated
-	 */
-	EntityGroup createEntityGroup();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	MetadataPackage getMetadataPackage();
-
-} //MetadataFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java
deleted file mode 100644
index acc23cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java
+++ /dev/null
@@ -1,871 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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>NOT API</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataFactory
- * @model kind="package"
- * @generated
- */
-public interface MetadataPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "metadata";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jst.jsf.common.metadata/metadata.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "md";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MetadataPackage eINSTANCE = org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl <em>Trait</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getTrait()
-	 * @generated
-	 */
-	int TRAIT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl <em>Entity</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntity()
-	 * @generated
-	 */
-	int ENTITY = 2;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__CHILD_ENTITIES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__TRAITS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__ID = 2;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__TYPE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__INCLUDE_GROUPS = 4;
-
-	/**
-	 * The number of structural features of the '<em>Entity</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl <em>Model</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModel()
-	 * @generated
-	 */
-	int MODEL = 0;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__CHILD_ENTITIES = ENTITY__CHILD_ENTITIES;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__TRAITS = ENTITY__TRAITS;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__ID = ENTITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__TYPE = ENTITY__TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__INCLUDE_GROUPS = ENTITY__INCLUDE_GROUPS;
-
-	/**
-	 * The feature id for the '<em><b>Entity Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__ENTITY_GROUPS = ENTITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__SOURCE_MODEL_PROVIDER = ENTITY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Current Model Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__CURRENT_MODEL_CONTEXT = ENTITY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Model</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL_FEATURE_COUNT = ENTITY_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl <em>Include Entity Group</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIncludeEntityGroup()
-	 * @generated
-	 */
-	int INCLUDE_ENTITY_GROUP = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl <em>Entity Group</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntityGroup()
-	 * @generated
-	 */
-	int ENTITY_GROUP = 1;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__CHILD_ENTITIES = ENTITY__CHILD_ENTITIES;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__TRAITS = ENTITY__TRAITS;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__ID = ENTITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__TYPE = ENTITY__TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__INCLUDE_GROUPS = ENTITY__INCLUDE_GROUPS;
-
-	/**
-	 * The number of structural features of the '<em>Entity Group</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP_FEATURE_COUNT = ENTITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__VALUE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__SOURCE_MODEL_PROVIDER = 2;
-
-	/**
-	 * The number of structural features of the '<em>Trait</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT_FEATURE_COUNT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Model Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP__MODEL_URI = 1;
-
-	/**
-	 * The number of structural features of the '<em>Include Entity Group</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '<em>ITrait Visitor</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getITraitVisitor()
-	 * @generated
-	 */
-	int ITRAIT_VISITOR = 5;
-
-	/**
-	 * The meta object id for the '<em>IEntity Visitor</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIEntityVisitor()
-	 * @generated
-	 */
-	int IENTITY_VISITOR = 6;
-
-	/**
-	 * The meta object id for the '<em>IMeta Data Source Model Provider</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIMetaDataSourceModelProvider()
-	 * @generated
-	 */
-	int IMETA_DATA_SOURCE_MODEL_PROVIDER = 7;
-
-
-	/**
-	 * The meta object id for the '<em>Model Context</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModelContext()
-	 * @generated
-	 */
-	int MODEL_CONTEXT = 8;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Trait <em>Trait</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Trait</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait
-	 * @generated
-	 */
-	EClass getTrait();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Trait#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.common.metadata.Trait#getId()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EAttribute getTrait_Id();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.common.metadata.Trait#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.common.metadata.Trait#getValue()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EReference getTrait_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EAttribute getTrait_SourceModelProvider();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup <em>Include Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Include Entity Group</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup
-	 * @generated
-	 */
-	EClass getIncludeEntityGroup();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#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.common.metadata.IncludeEntityGroup#getId()
-	 * @see #getIncludeEntityGroup()
-	 * @generated
-	 */
-	EAttribute getIncludeEntityGroup_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Model Uri</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri()
-	 * @see #getIncludeEntityGroup()
-	 * @generated
-	 */
-	EAttribute getIncludeEntityGroup_ModelUri();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Model <em>Model</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Model</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model
-	 * @generated
-	 */
-	EClass getModel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EAttribute getModel_SourceModelProvider();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Current Model Context</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EAttribute getModel_CurrentModelContext();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.common.metadata.Model#getEntityGroups <em>Entity Groups</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Entity Groups</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getEntityGroups()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EReference getModel_EntityGroups();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Entity <em>Entity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity
-	 * @generated
-	 */
-	EClass getEntity();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getChildEntities <em>Child Entities</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Child Entities</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getChildEntities()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_ChildEntities();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getTraits <em>Traits</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Traits</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getTraits()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_Traits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Entity#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.common.metadata.Entity#getId()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EAttribute getEntity_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Entity#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.common.metadata.Entity#getType()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EAttribute getEntity_Type();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups <em>Include Groups</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Include Groups</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_IncludeGroups();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.EntityGroup <em>Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Group</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.EntityGroup
-	 * @generated
-	 */
-	EClass getEntityGroup();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor <em>ITrait Visitor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>ITrait Visitor</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor" serializable="false"
-	 * @generated
-	 */
-	EDataType getITraitVisitor();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor <em>IEntity Visitor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>IEntity Visitor</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor" serializable="false"
-	 * @generated
-	 */
-	EDataType getIEntityVisitor();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider <em>IMeta Data Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>IMeta Data Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider"
-	 * @generated
-	 */
-	EDataType getIMetaDataSourceModelProvider();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor <em>Model Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Model Context</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor"
-	 * @generated
-	 */
-	EDataType getModelContext();
-
-	/**
-	 * 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
-	 */
-	MetadataFactory getMetadataFactory();
-
-	/**
-	 * <!-- 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.common.metadata.internal.impl.TraitImpl <em>Trait</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getTrait()
-		 * @generated
-		 */
-		EClass TRAIT = eINSTANCE.getTrait();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TRAIT__ID = eINSTANCE.getTrait_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TRAIT__VALUE = eINSTANCE.getTrait_Value();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Model Provider</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TRAIT__SOURCE_MODEL_PROVIDER = eINSTANCE.getTrait_SourceModelProvider();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl <em>Include Entity Group</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIncludeEntityGroup()
-		 * @generated
-		 */
-		EClass INCLUDE_ENTITY_GROUP = eINSTANCE.getIncludeEntityGroup();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute INCLUDE_ENTITY_GROUP__ID = eINSTANCE.getIncludeEntityGroup_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Model Uri</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute INCLUDE_ENTITY_GROUP__MODEL_URI = eINSTANCE.getIncludeEntityGroup_ModelUri();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl <em>Model</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModel()
-		 * @generated
-		 */
-		EClass MODEL = eINSTANCE.getModel();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Model Provider</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute MODEL__SOURCE_MODEL_PROVIDER = eINSTANCE.getModel_SourceModelProvider();
-
-		/**
-		 * The meta object literal for the '<em><b>Current Model Context</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute MODEL__CURRENT_MODEL_CONTEXT = eINSTANCE.getModel_CurrentModelContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Entity Groups</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MODEL__ENTITY_GROUPS = eINSTANCE.getModel_EntityGroups();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl <em>Entity</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntity()
-		 * @generated
-		 */
-		EClass ENTITY = eINSTANCE.getEntity();
-
-		/**
-		 * The meta object literal for the '<em><b>Child Entities</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY__CHILD_ENTITIES = eINSTANCE.getEntity_ChildEntities();
-
-		/**
-		 * The meta object literal for the '<em><b>Traits</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY__TRAITS = eINSTANCE.getEntity_Traits();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ENTITY__ID = eINSTANCE.getEntity_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ENTITY__TYPE = eINSTANCE.getEntity_Type();
-
-		/**
-		 * The meta object literal for the '<em><b>Include Groups</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY__INCLUDE_GROUPS = eINSTANCE.getEntity_IncludeGroups();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl <em>Entity Group</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntityGroup()
-		 * @generated
-		 */
-		EClass ENTITY_GROUP = eINSTANCE.getEntityGroup();
-
-		/**
-		 * The meta object literal for the '<em>ITrait Visitor</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getITraitVisitor()
-		 * @generated
-		 */
-		EDataType ITRAIT_VISITOR = eINSTANCE.getITraitVisitor();
-
-		/**
-		 * The meta object literal for the '<em>IEntity Visitor</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIEntityVisitor()
-		 * @generated
-		 */
-		EDataType IENTITY_VISITOR = eINSTANCE.getIEntityVisitor();
-
-		/**
-		 * The meta object literal for the '<em>IMeta Data Source Model Provider</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIMetaDataSourceModelProvider()
-		 * @generated
-		 */
-		EDataType IMETA_DATA_SOURCE_MODEL_PROVIDER = eINSTANCE.getIMetaDataSourceModelProvider();
-
-		/**
-		 * The meta object literal for the '<em>Model Context</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModelContext()
-		 * @generated
-		 */
-		EDataType MODEL_CONTEXT = eINSTANCE.getModelContext();
-
-	}
-
-} //MetadataPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java
deleted file mode 100644
index fbc5ada..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Model</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.jsf.common.metadata.Model#getEntityGroups <em>Entity Groups</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel()
- * @model extendedMetaData="kind='element' name='metadatamodel'"
- * @generated
- */
-public interface Model extends Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Model Provider</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 Model Provider</em>' attribute.
-	 * @see #setSourceModelProvider(IMetaDataSourceModelProvider)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_SourceModelProvider()
-	 * @model unique="false" dataType="org.eclipse.jst.jsf.common.metadata.IMetaDataSourceModelProvider" transient="true" volatile="true"
-	 * @generated
-	 */
-	IMetaDataSourceModelProvider getSourceModelProvider();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 */
-	void setSourceModelProvider(IMetaDataSourceModelProvider value);
-
-	/**
-	 * Returns the value of the '<em><b>Current Model Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Current Model Context</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Current Model Context</em>' attribute.
-	 * @see #setCurrentModelContext(ModelKeyDescriptor)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_CurrentModelContext()
-	 * @model dataType="org.eclipse.jst.jsf.common.metadata.ModelContext" transient="true" volatile="true"
-	 * @generated
-	 */
-	ModelKeyDescriptor getCurrentModelContext();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Current Model Context</em>' attribute.
-	 * @see #getCurrentModelContext()
-	 * @generated
-	 */
-	void setCurrentModelContext(ModelKeyDescriptor value);
-
-	/**
-	 * Returns the value of the '<em><b>Entity Groups</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.EntityGroup}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Entity Groups</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>Entity Groups</em>' reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_EntityGroups()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.EntityGroup"
-	 *        extendedMetaData="kind='element' name='entityGroup'"
-	 * @generated
-	 */
-	EList getEntityGroups();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param groupId 
-	 * @return EntityGroup
-	 * @model
-	 * @generated
-	 */
-	EntityGroup findIncludeGroup(String groupId);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.IEntityVisitor"
-	 * @generated
-	 */
-	void accept(IEntityVisitor visitor);
-
-} // Model
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java
deleted file mode 100644
index 4eb1b30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Trait</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.jsf.common.metadata.Trait#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Trait#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait()
- * @model extendedMetaData="kind='element' name='trait'"
- * @generated
- */
-public interface Trait 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.common.metadata.MetadataPackage#getTrait_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#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>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' 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(EObject)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait_Value()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EObject getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#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(EObject value);
-
-	/**
-	 * Returns the value of the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Model Provider</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 Model Provider</em>' attribute.
-	 * @see #setSourceModelProvider(IMetaDataSourceModelProvider)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait_SourceModelProvider()
-	 * @model dataType="org.eclipse.jst.jsf.common.metadata.IMetaDataSourceModelProvider"
-	 * @generated
-	 */
-	IMetaDataSourceModelProvider getSourceModelProvider();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 */
-	void setSourceModelProvider(IMetaDataSourceModelProvider value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param visitor 
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor"
-	 *        annotation="http://www.eclipse.org/emf/2002/GenModel body='visitor.visit(this);'"
-	 * @generated
-	 */
-	void accept(ITraitVisitor visitor);
-
-} // Trait
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.java
deleted file mode 100644
index 8719c18..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.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:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Convenient abstract class that a source model locator should consider extending.
- */
-public abstract class AbstractMetaDataLocator implements IMetaDataLocator, IMetaDataObservable{
-	
-	private IDomainSourceModelType domainSourceModelType;
-	private Set/*<IMetaDataObserver>*/ observers;
-
-	/**
-	 * Constructor
-	 */
-	public AbstractMetaDataLocator(){
-		observers = new HashSet(1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#getDomainSourceModelType()
-	 */
-	public IDomainSourceModelType getDomainSourceModelType() {
-		return domainSourceModelType;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#setDomainSourceModelType(org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType)
-	 */
-	public void setDomainSourceModelType(
-			IDomainSourceModelType domainSourceModelType) {
-		this.domainSourceModelType = domainSourceModelType;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#addObserver(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver)
-	 */
-	public void addObserver(IMetaDataObserver observer) {
-		observers.add(observer);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#removeObserver(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver)
-	 */
-	public void removeObserver(IMetaDataObserver observer) {	
-		observers.remove(observer);
-	}
-	
-	/**
-	 * @return the set of {@link IMetaDataObserver}s for this instance
-	 */
-	public Set/*<IMetaDataObserver>*/ getObservers(){
-		return observers;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java
deleted file mode 100644
index 99a06bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,362 +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.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-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.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-
-/**
- * Abstract class that the taglib domain translators use to 
- * convert the CM model to a standard meta data model
- *
- */
-public abstract class AbstractTagLibDomainContentModelMetaDataTranslator {
-	
-	/**
-	 * {@link IMetaDataModelMergeAssistant} to use
-	 */
-	protected IMetaDataModelMergeAssistant _assistant;
-
-	/**
-	 * Set the assistant to use during the translation.   Must be called prior to doTransalate(doc);
-	 * @param assistant
-	 */
-	protected void setAssistant(IMetaDataModelMergeAssistant assistant){
-		_assistant = assistant;
-	}
-	
-	/**
-	 * Transforms the CMDocument into entities and traits of a standard metadata model 
-	 * using the assistant that must be set before this call.
-	 * @param doc
-	 */
-	protected void doTranslate(CMDocument doc){
-		createTags(doc);
-		createTagfileTraits(doc);		
-	}
-	
-	/**
-	 * @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);
-
-			SimpleAnyType val = XMLTypeFactory.eINSTANCE.createSimpleAnyType();
-			val.setInstanceType(EcorePackage.eINSTANCE.getEString());
-			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);
-
-			SimpleAnyType val = XMLTypeFactory.eINSTANCE.createSimpleAnyType();
-			val.setInstanceType(EcorePackage.eINSTANCE.getEBoolean());
-			val.setRawValue(value == true ? "true" : "false");
-			
-			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 doc
-	 */
-	protected void createTags(final CMDocument doc) {
-		for (Iterator it=doc.getElements().iterator();it.hasNext();){
-			CMElementDeclaration tag = (CMElementDeclaration)it.next();
-			Entity entity = findTagEntity(tag.getNodeName());
-			if (entity == null){
-				entity = MetadataFactory.eINSTANCE.createEntity();
-				entity.setId(getTagNodeName(tag));
-				entity.setType("tag");
-				getMergedModel().getChildEntities().add(entity);
-			}
-			setTagEntityTraits(tag, entity);
-		}
-		
-	}
-	
-	/**
-	 * @param tag
-	 * @return tag node name
-	 */
-	protected String getTagNodeName(CMElementDeclaration tag) {
-		return tag.getNodeName();
-	}
-
-	/**
-	 * Sets the standard traits for a tag entity from the element declaration
-	 * @param tag
-	 * @param entity
-	 */
-	protected void setTagEntityTraits(CMElementDeclaration tag, Entity entity) {
-		createSimpleStringEntityTraitIfNecessary(entity, "display-label", getTagDisplayName(tag));
-		createSimpleStringEntityTraitIfNecessary(entity, "description", getTagDescription(tag));	
-		createSimpleStringEntityTraitIfNecessary(entity, "small-icon", getTagSmallIcon(tag));
-		createSimpleStringEntityTraitIfNecessary(entity, "large-icon", getTagLargeIcon(tag));
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "expert", getTagIsExpert(tag));
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "hidden", getTagIsHidden(tag));
-		
-		createAttributeEntities(entity, tag);
-	}
-	
-	/**
-	 * @param tagEntity
-	 * @param tag
-	 */
-	protected void createAttributeEntities(Entity tagEntity,
-			CMElementDeclaration tag) {
-		
-		for (Iterator it=tag.getAttributes().iterator();it.hasNext();){
-			CMAttributeDeclaration cmAttr = (CMAttributeDeclaration)it.next();			
-			Entity attr = findAttributeEntityForTagEntity(tagEntity, cmAttr.getAttrName());
-			if (attr == null) {
-				attr = MetadataFactory.eINSTANCE.createEntity();
-				attr.setId(cmAttr.getAttrName());
-				tagEntity.getChildEntities().add(attr);
-			}
-			createAttributeTraits(attr, cmAttr);
-		}
-			
-		
-	}
-
-	/**
-	 * @param attr
-	 * @param cmAttr
-	 */
-	protected void createAttributeTraits(Entity attr,
-			CMAttributeDeclaration cmAttr) {
-		
-		createSimpleStringEntityTraitIfNecessary(attr, "description", getTagAttributeDescription(cmAttr));	
-		createSimpleBooleanObjectEntityTraitIfNecessary(attr, "required", getTagAttributeIsRequired(cmAttr));
-		createSimpleStringEntityTraitIfNecessary(attr, "default-value", getTagAttributeDefaultValue(cmAttr));
-	}
-	
-	/**
-	 * @param cmAttr
-	 * @return null.   subclass should override if CMAttributeDeclaration has the metadata.
-	 */
-	protected String getTagAttributeDescription(CMAttributeDeclaration cmAttr) {return null;}
-	
-	/**
-	 * @param cmAttr
-	 * @return false.   subclass should override if CMAttributeDeclaration has the metadata.
-	 */
-	protected boolean getTagAttributeIsRequired(CMAttributeDeclaration cmAttr) {return cmAttr.getUsage() == CMAttributeDeclaration.REQUIRED;}
-
-	/**
-	 * @param cmAttr
-	 * @return null.   subclass should override if CMAttributeDeclaration has the metadata.
-	 */
-	protected String getTagAttributeDefaultValue(CMAttributeDeclaration cmAttr) {return null;}
-
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected boolean getTagIsHidden(CMElementDeclaration tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected boolean getTagIsExpert(CMElementDeclaration tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagLargeIcon(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagSmallIcon(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagDescription(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return tag.getElementName()
-	 */
-	protected String getTagDisplayName(CMElementDeclaration tag) {return tag.getElementName();}
-
-	/**
-	 * Creates standard traits for tag file entity from CMDocument metadata
-	 * @param doc
-	 */
-	protected void createTagfileTraits(CMDocument doc) {
-		Model model = getMergedModel();
-
-		createSimpleStringEntityTraitIfNecessary(model, "display-label", getURIDisplayLabel());			
-		createSimpleStringEntityTraitIfNecessary(model, "description", getURIDescription());
-		createSimpleStringEntityTraitIfNecessary(model, "default-prefix", getURIDefaultPrefix());
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "expert", getURIExpert());
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "hidden", getURIHidden());
-		
-	}
-	
-	/**
-	 * @return the display label to use for this model.  Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDisplayLabel(){
-		return getMergedModel().getId();
-	}
-	
-	/**
-	 * @return default prefix to use for tags.  Returns null. Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDefaultPrefix(){
-		return null;
-	}
-
-	/**
-	 * @return description to use.  Default is the URI.  Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDescription(){
-		return getMergedModel().getId();
-	}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getURIExpert() { return false;}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getURIHidden() {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() {
-		Model entity = getFactory().createModel();
-		entity.setId(_assistant.getMergedModel().getModelKey().getUri());
-		return entity;
-	}	
-	
-	/**
-	 * @return MetadataFactory instance
-	 */
-	protected MetadataFactory getFactory(){
-		return (MetadataFactory) MetadataPackage.eINSTANCE.getEFactoryInstance(); 
-	}
-	
-	/**
-	 * @return CMDocument being used for the current translate call
-	 */
-	protected CMDocument getSourceModel() {
-		return (CMDocument)_assistant.getSourceModelProvider().getSourceModel();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
deleted file mode 100644
index 93317b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
+++ /dev/null
@@ -1,195 +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.common.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Default class used for loading metadata.  
- * Loads the source types from extensions defined against the domain.
- * 
- * see org.eclipse.jst.jsf.common.domainLoadingStrategies ext-pt
- */
-public class DomainLoadingStrategy implements IDomainLoadingStrategy, IMetaDataObserver {
-
-	/**
-	 * Domain id
-	 */
-	protected String domain;
-
-	private MetaDataModel _model;
-	private List /*<IDomainSourceModelType>*/ _sourceTypes;
-	private List /*<IMetaDataSourceModelProvider>*/ _sources;
-	
-	/**
-	 * Constructor
-	 * @param domain
-	 */
-	public DomainLoadingStrategy(String domain){
-		this.domain = domain;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#load(org.eclipse.jst.jsf.common.metadata.internal.MetaDataModel)
-	 */
-	public void load(MetaDataModel model) {
-		this._model = model;
-		_sourceTypes = loadDomainSourceModelTypes();
-		sortSourceTypes(_sourceTypes);
-		_sources = locateMetaDataSourceInstances(_sourceTypes, model);
-	    mergeModel(model, _sources);		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#reload()
-	 */
-	public void reload() throws ModelNotSetException {
-		System.out.println("reload");//debug
-		if (_model == null)
-			throw new ModelNotSetException();
-		
-		removeOldLocatorObservers();
-		_sources = locateMetaDataSourceInstances(_sourceTypes, _model);
-	    mergeModel(_model, _sources);		
-	}
-	
-	/**
-	 * Responsible for iterating through the sorted list of <code>IMetaDataSourceModelProvider</code>
-	 * and merging the models after first translating the source model as required, into a single mreged model of
-	 * standard metadata Entities and Traits.
-	 * @param model 
-	 * @param sources
-	 */
-	protected void mergeModel(MetaDataModel model, List/*<IMetaDataSourceModelProvider>*/ sources) {		
-
-		StandardModelFactory.debug(">> Begin Merge: "+model.getModelKey()+"("+sources.size()+ " sources)", StandardModelFactory.DEBUG_MD_LOAD);
-
-		IMetaDataModelMergeAssistant assistant = createModelMergeAssistant(model);
-		for (Iterator/*<IMetaDataSourceModelProvider>*/ it = sources.iterator();it.hasNext();){
-			IMetaDataSourceModelProvider mds = (IMetaDataSourceModelProvider)it.next();		
-			Iterator translators = mds.getLocator().getDomainSourceModelType().getTranslators().iterator();
-			while (translators.hasNext()){
-				IMetaDataTranslator translator = (IMetaDataTranslator)translators.next();
-				if (translator.canTranslate(mds)){
-					StandardModelFactory.debug(">>> Merging: "+model.getModelKey()+"::"+mds, StandardModelFactory.DEBUG_MD_LOAD);
-					assistant.setSourceModelProvider(mds);
-					try {
-						translator.translate(assistant);
-					} catch (Exception e) {							
-						StandardModelFactory.debug(">>>> Error during translate/merge of: "+model.getModelKey()+": "+mds, StandardModelFactory.DEBUG_MD_LOAD);															
-						JSFCommonPlugin.log(IStatus.ERROR, "Error during load of: "+mds, e);
-					}
-				}				
-			}
-		}
-		assistant.setMergeComplete();
-		StandardModelFactory.debug(">> End Merge: "+model.getModelKey(),StandardModelFactory.DEBUG_MD_LOAD);
-	}
-	
-	/**
-	 * @param model
-	 * @return an instance of a IMetaDataModelMergeAssistant to be used while merging source models
-	 */
-	protected IMetaDataModelMergeAssistant createModelMergeAssistant(MetaDataModel model){
-		return new MetaDataModelMergeAssistantImpl(model);		
-	}
-
-	/**
-	 * Allows for subclasses to override the default mechanism for sorting the source types.
-	 * @param sourceTypes
-	 */
-	protected void sortSourceTypes(List/*<IDomainSourceModelType>*/ sourceTypes) {
-		//allows override
-	}
-
-	/**
-	 * @return list of <code>IDomainSourceModelType</code>s located in the <code>DomainSourceTypesRegistry</code> 
-	 * for the specified uri
-	 */
-	protected List/*<IDomainSourceModelType>*/ loadDomainSourceModelTypes() {
-		return DomainSourceTypesRegistry.getInstance().getDomainSourceTypes(domain); 
-	}
-
-	/**
-	 * @param sourceTypes
-	 * @param model
-	 * @return list of <code>IMetaDataSourceModelProvider</code> instances from the domain source types applicable for 
-	 * this domain for this particular uri specified in the model
-	 */
-	protected List/*<IMetaDataSourceModelProvider>*/ locateMetaDataSourceInstances(List/*<IDomainSourceModelType>*/ sourceTypes, MetaDataModel model) {
-		List/*<IMetaDataSourceModelProvider>*/ sources = new ArrayList/*<IMetaDataSourceModelProvider>*/();		
-		for (Iterator/*<IDomainSourceModelType>*/ it = sourceTypes.iterator();it.hasNext();){
-			IDomainSourceModelType sourceType = (IDomainSourceModelType)it.next();
-			IMetaDataLocator locator = sourceType.getLocator();
-			//We MUST set the sourceType here to associate the handler with locator to use for the source models
-			locator.setDomainSourceModelType(sourceType);
-			
-			//set project context in locator for those that care
-			if (locator instanceof IPathSensitiveMetaDataLocator)
-				((IPathSensitiveMetaDataLocator)locator).setProjectContext(model.getModelKey().getProject());
-			
-			List/*<IMetaDataSourceModelProvider>*/ providers = sourceType.getLocator().locateMetaDataModelProviders(model.getModelKey().getUri());
-			if (providers != null && !providers.isEmpty()){
-				for (Iterator mdProviders =providers.iterator();mdProviders.hasNext();){
-					IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)mdProviders.next();
-					//We MUST set the sourceType here to associate the translators to use for the source models
-					provider.setLocator(sourceType.getLocator());
-					sources.add(provider);
-				}
-			}
-			//listen for changes
-			sourceType.getLocator().addObserver(this);
-		}
-		return sources;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver#notifyMetadataChanged(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent)
-	 */
-	public void notifyMetadataChanged(IMetaDataChangeNotificationEvent event) {
-		//for now, if any event occurs, we need to flush the _model so that it will rebuild
-		_model.setNeedsRefresh();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#cleanup()
-	 */
-	public void cleanup(){
-		removeOldLocatorObservers();
-		_sources = null;
-		_sourceTypes = null;
-		_model = null;
-	}
-	
-	private void removeOldLocatorObservers(){
-		if (_sources != null){
-			for (Iterator it= _sources.iterator();it.hasNext();){				
-				IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)it.next();
-				if (provider != null) {
-					IMetaDataLocator locator = provider.getLocator();
-					if (locator != null){
-						locator.removeObserver(this);		
-						locator.setDomainSourceModelType(null);
-						provider.setLocator(null);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java
deleted file mode 100644
index 12a5fd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java
+++ /dev/null
@@ -1,175 +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.common.metadata.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-
-/**
- * Registry of strategies used to load domains of metadata.
- * Uses the <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt to load.  
- * 
- * see <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt 
- */
-public class DomainLoadingStrategyRegistry{
-	private static DomainLoadingStrategyRegistry INSTANCE;
-	
-	private HashMap/*<String, DomainLoadingStrategyDescriptorImpl>*/ domainLoadingStrategyDescriptors;
-	
-//	public static final String TAGLIB_DOMAIN ="TagLibraryDomain"; //this does *not* belong here.  FIX ME
-//	public static final String TAGLIB_DOMAIN_SOURCE_HANDLER_ID = TAGLIB_DOMAIN + "SourceHandler";
-//	public static final String TAGLIB_DOMAIN_TRANSLATOR = "com.foo.translators."+TAGLIB_DOMAIN + "Translator";
-
-	private static final String EXTENSION_POINT_ID = "domainLoadingStrategies";
-
-	private DomainLoadingStrategyRegistry(){
-		init();
-	}
-	
-	/**
-	 * @return singleton instance of the DomainLoadingStrategyRegistry
-	 */
-	public synchronized static DomainLoadingStrategyRegistry getInstance() {
-		if (INSTANCE == null){
-			INSTANCE = new DomainLoadingStrategyRegistry();
-		}
-		return INSTANCE;
-	}
-	
-	/**
-	 * Loads registry with descriptors from the domainLoadingStrategies ext-pt.    
-	 */
-	synchronized final void  init(){
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				DomainLoadingStrategyDescriptorImpl dls = new DomainLoadingStrategyDescriptorImpl(element);
-				addDomainLoadingStrategyDescriptor(dls);
-			}
-		}
-	}
-
-	/**
-	 * Add domain loading strategy descriptor for a domain to the registry domains
-	 * @param strategy
-	 */
-	protected void addDomainLoadingStrategyDescriptor(DomainLoadingStrategyDescriptorImpl strategy){
-		getDescriptors().put(strategy.getDomain(), strategy);
-	}
-	
-	/**
-	 * @param domain
-	 * @return an instance of an <code>IDomainLoadingStrategy</code> for the given domain
-	 */
-	public IDomainLoadingStrategy getLoadingStrategy(String domain){
-		DomainLoadingStrategyDescriptorImpl strategy = (DomainLoadingStrategyDescriptorImpl)getDescriptors().get(domain);
-		if (strategy == null){
-			return createDefaultLoadingStrategy();
-		}
-        return createLoadingStrategy(domain);
-	}
-
-	
-	/**
-	 * @return strategy that will only use standard metadata files
-	 */
-	private IDomainLoadingStrategy createDefaultLoadingStrategy() {
-		return new DomainLoadingStrategy(null);
-	}
-
-	private IDomainLoadingStrategy createLoadingStrategy(String domain){
-		return ((DomainLoadingStrategyDescriptorImpl)getDescriptors().get(domain)).newInstance();			
-	}
-	
-	private Map/*<String, DomainLoadingStrategyDescriptorImpl>*/ getDescriptors(){
-		if (domainLoadingStrategyDescriptors == null){
-			domainLoadingStrategyDescriptors = new HashMap/*<String, DomainLoadingStrategyDescriptorImpl>*/();			
-		}
-		return domainLoadingStrategyDescriptors;
-	}
-
-	/**
-	 * Implementation of a DomainLoadingStrategy descriptor that is responsible for creating instances of the IDomainLoadingStrategy
-	 */
-	private static class DomainLoadingStrategyDescriptorImpl {
-		String domain;
-		String loadingStrategyClassName;
-		String bundleId;
-		Class strategy;
-		IConfigurationElement element;
-		
-		DomainLoadingStrategyDescriptorImpl(IConfigurationElement element){
-			this.element = element;
-			this.init();
-		}
-
-		private void init() {
-			domain = element.getAttribute("domainId");
-			bundleId = element.getContributor().getName();
-			loadingStrategyClassName = element.getAttribute("domainLoadingStrategy");			
-		}
-
-		/**
-		 * @return domain id
-		 */
-		public String getDomain() {	
-			return domain;
-		}
-		
-		/**
-		 * @return new instance of IDomainLoadingStrategy
-		 */
-		public IDomainLoadingStrategy newInstance(){
-			try {
-				Class[] parameterTypes = new Class[]{String.class};
-				Object[] initargs = new Object[]{domain};
-				Object loader = this.getLoadingStrategy().getConstructor(parameterTypes).newInstance(initargs);
-				if (loader instanceof IDomainLoadingStrategy)
-					return (IDomainLoadingStrategy)loader;
-			} catch (InstantiationException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Unable to instantiate IDomainLoadingStrategy for: "+ domain,e);
-			} catch (IllegalAccessException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (IllegalArgumentException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalArgumentException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (SecurityException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "SecurityException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (InvocationTargetException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InvocationTargetException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (NoSuchMethodException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "NoSuchMethodException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			}
-			return null;
-		}
-		
-		private Class getLoadingStrategy() {		
-			if (strategy == null){
-				strategy = JSFCommonPlugin.loadClass(loadingStrategyClassName, bundleId);
-			}
-			return strategy;
-		}
-		
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
deleted file mode 100644
index 18259ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
+++ /dev/null
@@ -1,245 +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.common.metadata.internal;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Implementation of a {@link IDomainSourceModelType} descriptor.   
- * Responsible for producing instances of {@link IDomainSourceModelType}.  
- * Also responsible for creating the {@link IMetaDataTranslator} descriptors from the 
- * <code>com.eclipse.jst.jsf.common.domainSourceModelTypeTranslators</code> ext-pt
- */
-public class DomainSourceModelTypeDescriptor {
-	private static final String TRANSLATORS_EXTENSION_POINT_ID = "domainSourceModelTypeTranslators";
-	private static final String STANDARD_FILE_NULL_TRANSLATOR = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator";
-	private String domain = "DEFAULT";
-	private String domainSourceModelTypeId;
-	private String locatorClassName = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator";
-	private Set translatorDescriptors;
-	private String bundleId = JSFCommonPlugin.PLUGIN_ID;
-	private int ordinal;
-	private IDomainSourceModelType _instance;
-	
-	/**
-	 * Constructor
-	 * @param domain
-	 * @param domainSourceModelTypeId
-	 * @param locatorClassName
-	 * @param bundleId
-	 * @param ordinal
-	 */
-	public DomainSourceModelTypeDescriptor(String domain, String domainSourceModelTypeId, String locatorClassName, String bundleId, int ordinal){
-		this.domain = domain;
-		this.locatorClassName = locatorClassName;
-		this.domainSourceModelTypeId = domainSourceModelTypeId;
-		this.bundleId = bundleId;
-		this.ordinal = ordinal;
-		init();
-	}
-
-	/**
-	 * Default model type descriptor that will load only standard metadata files
-	 */
-	public DomainSourceModelTypeDescriptor(){
-//		getTranslatorDescriptors();
-		//createTranslatorInstances() will add the standard null translator 
-	}
-	
-	private synchronized void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, TRANSLATORS_EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
-				if (srcHdlrId.equals(domainSourceModelTypeId))
-					addTranslatorDescriptor(element);
-			}
-		}
-	}
-	
-	private void addTranslatorDescriptor(IConfigurationElement element) {
-		String translator = element.getAttribute("translatorClass");
-		DomainSourceModelTranslatorDescriptor d = new DomainSourceModelTranslatorDescriptor(translator, element.getContributor().getName());
-		getTranslatorDescriptors().add(d);
-	}
-
-	private Set getTranslatorDescriptors(){
-		if (translatorDescriptors == null){
-			translatorDescriptors = new HashSet();
-		}
-		return translatorDescriptors;
-	}
-
-	/**
-	 * @return domain
-	 */
-	public String getDomain() { 
-		return domain;
-	}
-	 
-	/**
-	 * @return singleton instance of the {@link IDomainSourceModelType}
-	 */
-	public IDomainSourceModelType getInstance(){
-		if (_instance == null){
-			_instance = newInstance();
-		}
-		return _instance;
-	}
-	/**
-	 * @return new instance of {@link IDomainSourceModelType} 
-	 */
-	private IDomainSourceModelType newInstance(){		
-
-		return new DomainSourceModelTypeImpl();
-	}
-	
-	/**
-	 * Internal class implementing {@link IDomainSourceModelType}
-	 */
-	class DomainSourceModelTypeImpl implements IDomainSourceModelType{
-
-		private Set translators;
-		private IMetaDataLocator locator;
-
-		DomainSourceModelTypeImpl(){
-            // restrict construction to package scope
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getDomain()
-		 */
-		public String getDomain() {
-			return domain;
-		}
-		
-		/**
-		 * @return value of ordinal defined by the ext-pt used for ordering source types for a domain
-		 */
-		public int getOrdinal(){
-			return ordinal;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getLocator()
-		 */
-		public IMetaDataLocator getLocator() {
-			if (locator == null){
-				locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId);
-			}
-								
-			return locator;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getTranslators()
-		 */
-		public Set getTranslators() {
-			if (translators == null){				
-				translators = createTranslatorInstances();
-			}
-			return translators;
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Object#toString()
-		 */
-		public String toString(){
-			StringBuffer buf = new StringBuffer("DomainSourceModelTypeImpl");
-			buf.append("(domain = ");
-			buf.append(getDomain());
-			buf.append(", locator = ");
-			buf.append(getLocator());
-			buf.append(")");
-			return buf.toString();
-		}
-		
-		private Set createTranslatorInstances() {
-			translators = new HashSet/*<IMetaDataTranslator>*/();
-			if (getTranslatorDescriptors().size() == 0){// for TagLibDomain, we are adding null translator via extension (as of 7/16/07)
-				//would get here if a domain and source type was defined without a domain translator.  Should not happen, but 
-				//add Null Translator for now....
-				//we could/should raise exception.  
-				//Developers should add a STANDARD_FILE_NULL_TRANSLATOR if using standard metadata format.
-				Class klass = JSFCommonPlugin.loadClass(STANDARD_FILE_NULL_TRANSLATOR, JSFCommonPlugin.PLUGIN_ID);
-				try {
-					translators.add(klass.newInstance());
-					return translators;
-				} catch (InstantiationException e) {
-                    // TODO: other error handling?
-					JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)");
-				} catch (IllegalAccessException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)");
-				}
-
-			}
-			
-			Iterator/*<DomainSourceModelTranslatorDescriptor>*/it = getTranslatorDescriptors().iterator();
-			while (it.hasNext()){
-				DomainSourceModelTranslatorDescriptor d = (DomainSourceModelTranslatorDescriptor)it.next();
-				Class klass = JSFCommonPlugin.loadClass(d.getTranslator(), d.getBundleId());
-				try {
-					translators.add(klass.newInstance());
-				} catch (InstantiationException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances");
-				} catch (IllegalAccessException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances");
-				}
-			}
-			return translators;
-		}
-
-	}
-	
-	/**
-	 * Internal class implementing a descriptor for DomainSourceModelTranslators
-	 */
-	static class DomainSourceModelTranslatorDescriptor {
-
-		private String _translator;
-		private String _bundleId;
-
-		/**
-		 * Constructor
-		 * @param translator
-		 * @param bundleId
-		 */
-		public DomainSourceModelTranslatorDescriptor(String translator, String bundleId) {
-			this._translator = translator;
-			this._bundleId = bundleId;
-		}
-		
-		String getTranslator(){
-			return _translator;
-		}
-		
-		String getBundleId(){
-			return _bundleId;
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
deleted file mode 100644
index 9ace164..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
+++ /dev/null
@@ -1,144 +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.common.metadata.internal;
-
-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.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.internal.DomainSourceModelTypeDescriptor.DomainSourceModelTypeImpl;
-
-/**
- * Registry of Domain Source Types loaded from domainSourceModelTypes ext-pt.
- */
-public class DomainSourceTypesRegistry{
-	private static final String EXTENSION_POINT_ID = "domainSourceModelTypes";
-	private static DomainSourceTypesRegistry INSTANCE;
-	private Map/*<String, List/*<DomainSourceModelTypeDescriptor>>*/ domainSourceTypeDescriptors;
-	private Map/*<String, List/*<IDomainSourceModelType>*/ domainSourceTypes;
-	
-	private DomainSourceTypesRegistry(){
-		init();
-	}
-
-	/**
-	 * @return singleton instance of DomainSourceTypesRegistry
-	 */
-	public synchronized static DomainSourceTypesRegistry getInstance() {
-		if (INSTANCE == null){
-			INSTANCE = new DomainSourceTypesRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * @param domain identifier
-	 * @return list of <code>IDomainSourceModelType</code> sorted in descending order by ordinal
-	 */
-	public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
-		if (getDomainSourceTypes().containsKey(domain))
-			return (List)getDomainSourceTypes().get(domain);
-		
-		List/*<DomainSourceModelTypeDescriptor>*/ list = getDomainSourceModelDescriptors(domain);
-		List/*<IDomainSourceModelType>*/ types = new ArrayList/*<IDomainSourceModelType>*/();
-		for(Iterator/*<DomainSourceModelTypeDescriptor>*/ it=list.iterator();it.hasNext();){
-			DomainSourceModelTypeDescriptor d = (DomainSourceModelTypeDescriptor)it.next();
-			types.add(d.getInstance());
-		}
-		//default sort descending by ordinal 
-		Collections.sort(types, new Comparator(){
-			public int compare(Object o1, Object o2) {
-				DomainSourceModelTypeImpl desc1 = (DomainSourceModelTypeImpl)o1;
-				DomainSourceModelTypeImpl desc2 = (DomainSourceModelTypeImpl)o2;
-				if (desc1.getOrdinal() == desc2.getOrdinal())
-						return 0;
-				if (desc1.getOrdinal() > desc2.getOrdinal())
-					return -1;
-				
-				return 1;
-			}
-			
-		});
-		
-		getDomainSourceTypes().put(domain, types);
-		return types;
-	}
-	
-	private List getDomainSourceModelDescriptors(String domain) {
-		List ret = (List)getDescriptors().get(domain);
-		if (ret != null && ret.size()>0)
-			return ret;
-		
-		return getDefaultSourceModelDescriptor();
-	}
-
-	private List getDefaultSourceModelDescriptor() {
-		List ret = new ArrayList();
-		DomainSourceModelTypeDescriptor desc = new DomainSourceModelTypeDescriptor();
-		ret.add(desc);
-		return ret;
-	}
-
-	private synchronized void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				addDomainSourceTypeDescriptor(element);
-			}
-		}
-	}
-
-	private void addDomainSourceTypeDescriptor(IConfigurationElement element) {
-		String domainId = element.getAttribute("domainId");
-		String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
-		String locator = element.getAttribute("locator");
-		String ordinalStr = element.getAttribute("ordinal");
-		int ordinal = 1;
-		if (ordinalStr!=null && !ordinalStr.equals("")){
-			ordinal = Integer.parseInt(ordinalStr);
-		}
-		DomainSourceModelTypeDescriptor d = new DomainSourceModelTypeDescriptor(domainId, srcHdlrId, locator, element.getContributor().getName(), ordinal);
-		List/*<DomainSourceTypeDescriptor>*/ descs = (List)getDescriptors().get(domainId);
-		if (descs == null){
-			descs = new ArrayList/*<DomainSourceTypeDescriptor>*/();
-			getDescriptors().put(domainId, descs);
-		}
-		descs.add(d);
-	}
-
-	private Map/*<String, List/*<DomainSourceTypeDescriptor>>*/ getDescriptors() {
-		if (domainSourceTypeDescriptors == null){
-			domainSourceTypeDescriptors = new HashMap/*<String, List/*<DomainSourceTypeDescriptor>>*/();
-		}
-		return domainSourceTypeDescriptors;
-	}
-	
-	private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
-		if (domainSourceTypes == null){
-			domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
-		}
-		return domainSourceTypes;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java
deleted file mode 100644
index 6c81696..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Provides class loading by using the plugin's classloader that defined an item of metadata
- */
-public interface IClassLoaderProvider {
-	/**
-	 * @param className
-	 * @return Class - implementers should eat exceptions and return null whenever class cannot be returned
-	 */
-	public Class loadClass(String className);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java
deleted file mode 100644
index ee21e62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java
+++ /dev/null
@@ -1,42 +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.common.metadata.internal;
-
-
-/**
- * Defines a strategy to use for loading a standard metadata model for a certain domain.
- * see <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt 
- */
-public interface IDomainLoadingStrategy {
-	
-	/**
-	 * Create a merged "standard" metadata model.  
-	 * @param model to load
-	 * 
-	 */
-	public void load(MetaDataModel model);
-	
-	/**
-	 * Reload a merged "standard" metadata model.  
-	 * Allows for some optimization for reload.
-	 * @throws ModelNotSetException 
-	 * 
-	 */
-	public void reload() throws ModelNotSetException;
-	
-	
-	/**
-	 * Opportunity to cleanup and should be called when strategy is being destroyed
-	 */
-	public void cleanup();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
deleted file mode 100644
index 296c4a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
+++ /dev/null
@@ -1,35 +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.common.metadata.internal;
-
-import java.util.Set;
-
-/**
- * Binds a domain of metadata to a source model type which is defined by a {@link IMetaDataLocator} 
- * and set of {@link IMetaDataTranslator}s
- * Not intended to be implemented by clients.  Created from ext-pts.
- */
-public interface IDomainSourceModelType {
-	/**
-	 * @return domain id
-	 */
-	public String getDomain();
-	/**
-	 * @return IMetaDataLocator
-	 */
-	public IMetaDataLocator getLocator();
-//	public int getOrdinal();
-	/**
-	 * @return set of {@link IMetaDataTranslator}s for the domain source model type
-	 */
-	public Set/*<IMetaDataTranslator>*/ getTranslators();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.java
deleted file mode 100644
index 9405a6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.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.common.metadata.internal;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Provides image descriptors relative to the plugin that provided the image metadata
- *
- */
-public interface IImageDescriptorProvider {
-	/**
-	 * @param imagePath
-	 * @return ImageDescriptor - implementers should eat exceptions and return null whenever imageDescriptor cannot be returned
-	 */
-	public ImageDescriptor getImageDescriptor(String imagePath);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.java
deleted file mode 100644
index 29c6ce1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.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:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Experimental and not used at the moment.
- *
- */
-public interface IMetaDataChangeNotificationEvent {
-	//change to enums if we do Java5
-	/**
-	 *  TODO:
-	 */
-	public static final int ADDED = 1;
-	/**
-	 * TODO:
-	 */
-	public static final int REMOVED = 2;
-	/**
-	 * TODO:
-	 */
-	public static final int CHANGED = 3;
-	
-	/**
-	 * @return the uri
-	 */
-	public String getURI();
-	/**
-	 * @return when to the event types above
-	 */
-	public int getEventType();
-	/**
-	 * @return the meta-data locator
-	 */
-	public IMetaDataLocator getLocator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.java
deleted file mode 100644
index ffdbd62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.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.common.metadata.internal;
-
-import java.util.List;
-
-/**
- * Locates instances of metadata of a specific source model type
- */
-public interface IMetaDataLocator {
-	/**
-	 * @param uri
-	 * @return a list of <code>IMetaDataModelProvider</code>s for the uri located by this instance 
-	 */
-	public List/*<IMetaDataModelProvider>*/ locateMetaDataModelProviders(String uri);
-	
-	/**
-	 * Opportunity for service to start (add listeners, etc.). 
-	 * Framework calls this immediately after construction and all setup should occur at this time.
-	 */
-	public void startLocating();
-	/**
-	 * Stop looking for instances of metadata model sources.  An opportunity to cleanup. 
-	 */
-	public void stopLocating();
-
-	/**
-	 * @param observer add a {@link IMetaDataObserver} of this locator 
-	 */
-	public void addObserver(IMetaDataObserver observer);
-	/**
-	 * @param observer remove a {@link IMetaDataObserver} of this locator 
-	 */
-	public void removeObserver(IMetaDataObserver observer);
-	
-	/**
-	 * @return IDomainSourceModelType instance that created this locator
-	 */
-	public IDomainSourceModelType getDomainSourceModelType();
-	/**
-	 * @param domainSourceModelType set the domainSourceModelType instance that created this locator
-	 */
-	public void setDomainSourceModelType(IDomainSourceModelType domainSourceModelType);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java
deleted file mode 100644
index d579a63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java
+++ /dev/null
@@ -1,73 +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.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-/**
- * Helper class interface to merge source models into a single merged model.
- * Not intended to be implemented by clients
- *
- */
-public interface IMetaDataModelMergeAssistant {
-	/**
-	 * @return merged model
-	 */
-	public MetaDataModel getMergedModel();
-	/**
-	 * Method that will first check to see if an entity with the same id exists in the merged model. 
-	 * If not, it will add it.   The entities includeGroups are then also merged.
-	 * @param entity
-	 * @return flag indicating whether or not the entity was new and therefore added to the merged model
-	 *  
-	 */
-	public boolean addEntity(Entity entity);
-	/**
-	 * Method will add an entity if not already existing in the merged model, and then check for an existing trait by id on the merged model's entity.
-	 * @param entity
-	 * @param trait
-	 * @return flag indicating whether or not the traits was new and therefore added to the merged model's entity
-	 */
-	public boolean addTrait(Entity entity, Trait trait);
-	
-	/**
-	 * Method will add an entityGroup to the model if not already exiting in the merged model (by id).
-	 * @param entityGroup
-	 */
-	public void addEntityGroup(EntityGroup entityGroup);
-	/**
-	 * Signal that the merge is complete so that any post-processing may occur.  
-	 * This should be the last call made on the merge assistant and should be done before client calls for the merged model result.
-	 * This should signal that entityGroups processing should begin.
-	 */
-	public void setMergeComplete();
-
-	/**
-	 * @param mds - {@link IMetaDataSourceModelProvider}
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider mds);
-	/**
-	 * @return {@link IMetaDataSourceModelProvider} for current operation
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider();
-
-	/**
-	 * @param queryRoot
-	 * @param entityKey - key relative to queryRoot
-	 * @return entity - will return null if not found
-	 */
-	public Entity getMergedEntity(Entity queryRoot, String entityKey);
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java
deleted file mode 100644
index 69152d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java
+++ /dev/null
@@ -1,35 +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.common.metadata.internal;
-
-/**
- * Allows {@link IMetaDataObserver}s to observe changes.
- * Experimental.
- *
- */
-public interface IMetaDataObservable {
-	/**
-	 * Add the observer to the set of observers.  Has no effect if
-	 * the same observer is already registered
-	 * 
-	 * @param observer
-	 */
-	public void addObserver(IMetaDataObserver observer);
-
-	/**
-	 * Remove the observer from the set of observers.  Has no effect
-	 * if observer was not already registered.
-	 * 
-	 * @param observer must not be null
-	 */
-	public void removeObserver(IMetaDataObserver observer);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java
deleted file mode 100644
index 5a138a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java
+++ /dev/null
@@ -1,24 +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.common.metadata.internal;
-
-/**
- * Interface for notification when an {@link IMetaDataObservable} changes
- *
- */
-public interface IMetaDataObserver {
-	/**
-	 * Callback to observer when an {@link IMetaDataObservable} throws an event
-	 * @param event
-	 */
-	public void notifyMetadataChanged(IMetaDataChangeNotificationEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.java
deleted file mode 100644
index 6a19c3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.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.common.metadata.internal;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-
-/**
- * Provides a source of metadata that can be transformed into a merged standard model
- * LIKELY TO CHANGE
- */
-public interface IMetaDataSourceModelProvider extends IAdaptable{
-	/**
-	 * @return the source model
-	 */
-	public Object getSourceModel();
-	/**
-	 * @return the IMetaDataLocator instance that located this model provider instance
-	 */
-	public IMetaDataLocator getLocator();
-	/**
-	 * @param locator instance that located this model provider instance
-	 */
-	public void setLocator(IMetaDataLocator locator);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java
deleted file mode 100644
index 2a7f6e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java
+++ /dev/null
@@ -1,28 +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.common.metadata.internal;
-
-/**
- * Translate from the source model metadata structure into a standard metadata domain of metadata.
- *
- */
-public interface IMetaDataTranslator {
-	/**
-	 * @param assistant perform translation using the IMetaDataModelMergeAssistant
-	 */
-	public void translate(IMetaDataModelMergeAssistant assistant);
-	/**
-	 * @param modelProvider - cannot be null
-	 * @return true if this translator can translate this model source
-	 */
-	public boolean canTranslate(IMetaDataSourceModelProvider modelProvider);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java
deleted file mode 100644
index 0f0ed71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java
+++ /dev/null
@@ -1,24 +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.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * A <code>IMetaDataLocator</code> that is sensitive to the project context 
- */
-public interface IPathSensitiveMetaDataLocator extends IMetaDataLocator {
-	/**
-	 * @param project
-	 */
-	public void setProjectContext(IProject project);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.java
deleted file mode 100644
index 640da35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.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.common.metadata.internal;
-
-import java.util.ResourceBundle;
-
-/**
- * Provides the resource bundle from the plugin that defined an item of metadata.
- */
-public interface IResourceBundleProvider {
-	/**
-	 * @return ResourceBundle - implementers should eat exceptions and return null whenever resourceBundle cannot be returned
-	 */
-	public ResourceBundle getResourceBundle();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceURLProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceURLProvider.java
deleted file mode 100644
index f82d0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceURLProvider.java
+++ /dev/null
@@ -1,32 +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.common.metadata.internal;
-
-import java.net.URL;
-
-/**
- * Provides absolute URLs from resource path, which is relative to the plug-in
- * with the metadata that specified the resource path.
- *  
- * @author Ian Trimble - Oracle
- */
-public interface IResourceURLProvider {
-
-	/**
-	 * Get absolute URL for resource path, which is relative to the plug-in that
-	 * specified the resource metadata.
-	 * 
-	 * @param resourcePath Path to resource, relative to metadata plug-in.
-	 * @return Absolute URL for resource path.
-	 */
-	public URL getResourceURL(String resourcePath);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java
deleted file mode 100644
index 02270a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java
+++ /dev/null
@@ -1,32 +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.common.metadata.internal;
-
-
-/**
- * Represents the metadata file defined by the StandardMetaDataFile extension-point
- * Not intended to be implemented by clients
- */
-public interface IStandardMetaDataSourceInfo {
-	/**
-	 * @return location of metadata file that the locator class will use 
-	 */
-	public String getLocation();
-	/**
-	 * @return bundle id of plugin defining the metadata file
-	 */
-	public String getBundleId();
-	/**
-	 * @return class name of the locator that will find the the standard metadata file
-	 */
-	public String getLocatorClassname();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java
deleted file mode 100644
index 9aeb8b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java
+++ /dev/null
@@ -1,41 +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.common.metadata.internal;
-
-import java.util.List;
-
-
-/**
- * Strategy for loading tag metadata.   Extends and uses the default {@link DomainLoadingStrategy}.  
- * Mainly exists for illustrative purposes.  Could be removed..
- */
-public class JSPTagLibDomainLoadingStrategy extends DomainLoadingStrategy {
-
-	/**
-	 * Constructor
-	 * @param domain
-	 */
-	public JSPTagLibDomainLoadingStrategy(String domain) {
-		super(domain);
-	}
-
-	/*@Override*/
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.DomainLoadingStrategy#sortSourceTypes(java.util.List)
-	 */
-	protected void sortSourceTypes(List/*<IDomainSourceType>*/ sourceTypes) {
-		//an opportunity to override the priority of the source types...
-	}
-
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.java
deleted file mode 100644
index 74fd0a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.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:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized strings for Metadata
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.metadata.internal.messages"; //$NON-NLS-1$
-
-	/**
-	 * Property key not found in bundle
-	 */
-	public static String Key_not_found;
-
-	/**
-	 * Missing resource
-	 */
-	public static String MissingResource_exception;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-        // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.java
deleted file mode 100644
index 8ecc17d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.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.common.metadata.internal;
-
-/**
- * Experimental.  Subject to change.
- *
- */
-public class MetaDataChangeNotificationEvent implements
-		IMetaDataChangeNotificationEvent {
-
-	private String _uri;
-	private IMetaDataLocator _locator;
-	private int _type;
-
-	/**
-	 * Constructor
-	 * @param locator
-	 * @param uri
-	 * @param type
-	 */
-	public MetaDataChangeNotificationEvent(IMetaDataLocator locator, String uri, int type){
-		this._locator = locator;
-		this._uri = uri;
-		this._type = type;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getEventType()
-	 */
-	public int getEventType() {
-		return _type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getLocator()
-	 */
-	public IMetaDataLocator getLocator() {
-		return _locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getURI()
-	 */
-	public String getURI() {
-		return _uri;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
deleted file mode 100644
index ed92cf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.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.jsf.common.metadata.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Creates instances of IMetaDataLocators and caches them so that there is only one instance of a particular locator
- * when client requests one. 
- */
-public class MetaDataLocatorFactory {
-	private static MetaDataLocatorFactory INSTANCE = null;
-	
-	/**
-	 * @return singleton instance of the MetaDataLocatorFactory
-	 */
-	public synchronized static MetaDataLocatorFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataLocatorFactory();
-		}
-		return INSTANCE;
-	}
-
-	private HashMap _locators;
-
-	private Map getLocators() {
-		if (_locators == null){
-			_locators = new HashMap();
-		}
-		return _locators;
-	}
-	
-	/**
-	 * @param locatorClassName
-	 * @param bundleId
-	 * @return IMetaDataLocator
-	 */
-	public IMetaDataLocator getLocator(String locatorClassName, String bundleId){
-		String key = getKey(locatorClassName, bundleId);
-		IMetaDataLocator locator = (IMetaDataLocator)getLocators().get(key);
-		if (locator == null){
-			Class klass = JSFCommonPlugin.loadClass(locatorClassName, bundleId);
-			try {
-				locator = (IMetaDataLocator)klass.newInstance();
-				if (locator != null) {
-					getLocators().put(key, locator);
-					locator.startLocating();
-				}
-			} catch (InstantiationException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Could not instantiate IMetaDataLocator: "+key, e);
-			} catch (IllegalAccessException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException while creating IMetaDataLocator: "+key, e);
-			}
-		}
-		return locator;
-	}
-
-	private String getKey(String locatorClassName, String bundleId) {
-		StringBuffer buf = new StringBuffer(bundleId);
-		buf.append(":");
-		buf.append(locatorClassName);
-		return buf.toString();
-	}
-	
-	/**
-	 * Stops and disposes all locators
-	 */
-	public void dispose(){
-		for (Iterator it=getLocators().values().iterator();it.hasNext();){
-			IMetaDataLocator locator = (IMetaDataLocator)it.next();
-			locator.stopLocating();			
-		}
-		getLocators().clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java
deleted file mode 100644
index 413048c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java
+++ /dev/null
@@ -1,125 +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.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.Model;
-
-/**
- * Responsible for loading and holding onto the standard metadata model using the IDomainLoadingStrategy.
- * Wraps the model (root) with the strategy used for loading it, along with the identifying key (modelKeyDescriptor)
- */
-public class MetaDataModel {
-
-	private Object root;
-	private ModelKeyDescriptor modelKeyDescriptor;
-	private IDomainLoadingStrategy strategy;
-	private boolean refresh;
-	
-	/**
-	 * Constructor
-	 * @param key
-	 * @param strategy
-	 */
-	public MetaDataModel(ModelKeyDescriptor key, IDomainLoadingStrategy strategy){
-		this.modelKeyDescriptor = key;
-		this.strategy = strategy;
-	}
-
-	/**
-	 * @return the root of the model.  
-	 */
-	public Object getRoot(){
-		return root;
-	}
-	
-	/**
-	 * @param root 
-	 */
-	public void setRoot(Object root){
-		this.root = root;
-		if (root != null)
-			((Model)root).setCurrentModelContext(modelKeyDescriptor);
-	}
-	
-	/**
-	 * @return ModelKeyDescriptor for this model
-	 */
-	public ModelKeyDescriptor getModelKey(){
-		return modelKeyDescriptor;
-	}
-
-//	public void accept(IEntityVisitor visitor){
-//		if (getRoot() instanceof Model)
-//			visitor.visit((Model)getRoot());
-//	}
-
-	/**
-	 * @return true if the model is null or is not, in fact, a {@link Model}
-	 */
-	public boolean isEmpty() {
-		if (root == null || !(root instanceof Model))
-			return true;
-				
-		return false;
-	}
-	
-	/**
-	 * Load the model.  Delegates to the strategy.
-	 */
-	public synchronized void load(){
-		StandardModelFactory.debug("> Begin Loading: "+getModelKey(), StandardModelFactory.DEBUG_MD_LOAD);
-		strategy.load(this);
-		StandardModelFactory.debug("> End Loading: "+getModelKey(),StandardModelFactory.DEBUG_MD_LOAD);
-	}
-	
-	/**
-	 * Reloads the model delegating to strategy reload
-	 * @throws ModelNotSetException
-	 */
-	public void reload()throws ModelNotSetException{
-		setRoot(null);
-		refresh = false;
-		strategy.reload();
-	}
-
-	/**
-	 * @return flag indicating that the model is stale
-	 */
-	public boolean needsRefresh() {		
-		return refresh;
-	}
-	
-	/**
-	 * Flag that model is stale
-	 */
-	public void setNeedsRefresh() {		
-		refresh = true;
-	}
-	
-	/**
-	 * Cleans up the model releasing references.
-	 */
-	public void cleanup(){
-		if (strategy != null)
-			strategy.cleanup();
-		strategy = null;
-		root = null;
-		modelKeyDescriptor = null;
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer("MetaDataModel: ");
-		buf.append(getModelKey());
-		return buf.toString();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java
deleted file mode 100644
index 03a99fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.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:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.query.IMetaDataModelContext;
-
-/**
- * Simple implementation of {@link IMetaDataModelContext}
- *
- */
-public class MetaDataModelContextImpl implements IMetaDataModelContext, Cloneable {
-	private final String _domain;
-	
-	/**
-	 * Constructor
-	 * @param domain id
-	 */
-	public MetaDataModelContextImpl(final String domain){
-		_domain = domain;
-	}
-	
-	public String getDomainID() {
-		return _domain;
-	}
-
-	public Object getAdapter(final Class adapter) {
-		if (IMetaDataModelContext.class.equals(adapter))
-			return this;
-		return null;
-	}
-
-    @Override
-    protected Object clone() throws CloneNotSupportedException {
-        return super.clone();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
deleted file mode 100644
index fe56907..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
+++ /dev/null
@@ -1,309 +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.common.metadata.internal;
-
-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.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Singleton instance for each IProject used to manage all standard metdata models for that project.
- *
- * Manager is responsible for loading and caching MetaDataModels.  Models are keyed by URI.
- * 
- * The manager listens for project closing resource events so that the resources can be freed up.
- */
-public class MetaDataModelManager implements IResourceChangeListener{
-	/**
-	 * Key that is used for the IProject instance's session property that
-	 * holds a MetaDataModelManager instance.  Each project will have it's own instance of a model manager.
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(null, "MetaDataModelManager"); //$NON-NLS-1$ FIX ME	
-
-	private static MetaDataModelManager SHARED_INSTANCE;
-	
-	// used to lock all instance calls for getModel
-	private static final Object  GLOBAL_INSTANCE_LOCK = new Object();
-	private final ModelMap models; 
-	private final IProject project;
-	
-	
-	/**
-	 * @return instance that is project agnostic.   * may get removed * 
-	 */
-	public synchronized static MetaDataModelManager getSharedInstance(){
-		if (SHARED_INSTANCE == null) {
-			SHARED_INSTANCE = new MetaDataModelManager(null);
-		}
-		return SHARED_INSTANCE;
-	}
-	
-	/**
-	 * @param project
-	 * @return instance of the model manager for this project.  Shouldn't, but may, return null.
-	 */
-	public synchronized static MetaDataModelManager getInstance(final IProject project){
-		MetaDataModelManager repo = null;
-		repo = getFromSessionProperty(project);
-		if (repo == null) {
-			repo = new MetaDataModelManager(project);		
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(repo, IResourceChangeEvent.PRE_CLOSE);
-		}
-		return repo;
-	}
-	private MetaDataModelManager(final IProject project) {
-		this.project = project;
-		models = new ModelMap();  
-        setAsSessionProperty();
-	}
-	
-	/**
-	 * @param project
-	 * @return MetaDataModelManager instance for the project
-	 */
-	private static MetaDataModelManager getFromSessionProperty(final IProject project) {
-		MetaDataModelManager repo = null;
-		try {
-			Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY);
-			if (obj instanceof MetaDataModelManager) {
-				repo = (MetaDataModelManager)obj;
-			}
-		} catch(CoreException ce) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to recover MetaDataModelManager for: "+project.getName(), ce); //$NON-NLS-1$
-		}
-		return repo;
-	}
-
-	/**
-	 * Sets this MetaDataModelManager instance as a session property of its
-	 * IProject instance.
-	 */
-	private void setAsSessionProperty() {
-		if (project != null) {//&& project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, this);
-			} catch(CoreException ce) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to store MetaDataModelManager for: "+project.getName(), ce); //$NON-NLS-1$		}
-			}
-		}
-	}
-	
-	/**
-	 * Releases a project's MetaDataModelManager instance by removing from project session property
-	 * @param aProject
-	 */
-	private void removeAsSessionProperty(IProject aProject){
-		try {
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-			aProject.setSessionProperty(KEY_SESSIONPROPERTY, null);
-		} catch (CoreException e) {
-            JSFCommonPlugin.log(e, "Error removing session property"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-     * Will locate the cached MetaDataModel. Sets the model context in the
-     * model.
-     * 
-     * @param modelContext
-     * @return the MetaDataModel for the given ITaglibDomainMetaDataModelContext
-     */
-    public MetaDataModel getModel(
-            final ITaglibDomainMetaDataModelContext modelContext) {
-        synchronized (GLOBAL_INSTANCE_LOCK) {
-            ModelKeyDescriptor modelKeyDescriptor = StandardModelFactory.getInstance().createModelKeyDescriptor(modelContext);
-
-            StandardModelFactory.debug(">START getModel: "+modelKeyDescriptor, StandardModelFactory.DEBUG_MD_GET);
-
-            MetaDataModel model = models.get(modelKeyDescriptor);
-            if (model == null || project == null) {
-                // long in = System.currentTimeMillis();
-                model = loadMetadata(modelKeyDescriptor);
-                //System.out.println("Time to load "+modelContext.getURI()+": "+
-                // String.valueOf(System.currentTimeMillis() - in));
-            } else if (model.needsRefresh()) {
-                try {
-                    model.reload();
-                } catch (ModelNotSetException e) {
-                    // simply load it - should not get here
-                    model = loadMetadata(modelKeyDescriptor);
-                }
-            }
-            if (model != null && model.getRoot() != null)
-                ((Model) model.getRoot())
-                        .setCurrentModelContext(modelKeyDescriptor);
-
-            StandardModelFactory.debug(">END getModel: "+modelKeyDescriptor, StandardModelFactory.DEBUG_MD_GET);
-            return model;
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org
-     * .eclipse.core.resources.IResourceChangeEvent)
-     */
-    public void resourceChanged(IResourceChangeEvent event) {
-        if (event.getType() == IResourceChangeEvent.PRE_CLOSE
-                || event.getType() == IResourceChangeEvent.PRE_DELETE) {
-            // a project is closing - release and cleanup
-            final IProject aProject = (IProject) event.getResource();
-            if (aProject != null && aProject.equals(this.project)) {
-                SafeRunnable.run(new ISafeRunnable() {
-
-                    public void handleException(Throwable exception) {
-                        JSFCommonPlugin.log(exception);
-                    }
-
-                    public void run() throws Exception {
-                        models.dispose();
-                        removeAsSessionProperty(project);
-                    }
-                });
-            }
-        }
-    }
-
-	private MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor) {
-        if (!Thread.holdsLock(GLOBAL_INSTANCE_LOCK)) {
-            JSFCommonPlugin
-                    .log(IStatus.ERROR,
-                            "Internal Error: loadMetadata must not be called if class lock not held");
-            return null;
-        }
-
-        IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry
-                .getInstance().getLoadingStrategy(
-                        modelKeyDescriptor.getDomain());
-        ;
-        if (strategy == null) {
-            JSFCommonPlugin
-                    .log(
-                            IStatus.ERROR,
-                            "Internal Error: Unable to locate metadata loading strategy for: " + modelKeyDescriptor.toString()); //$NON-NLS-1$
-            return null;
-        }
-        MetaDataModel model = StandardModelFactory.getInstance().createModel(
-                modelKeyDescriptor, strategy);// new MetaDataModel(modelKey,
-                                              // strategy);
-        model.load();
-        addModel(model);
-
-        return model;
-    }
-
-    private void addModel(MetaDataModel model) {
-        if (model != null)
-            models.put(model);
-    }
-
-    /**
-     * Map of models keyed by ModelKeyDescriptor (.toString())
-     * 
-     */
-    private static class ModelMap 
-    {
-        private final Map<String, MetaDataModel> map;
-        private final AtomicBoolean _isDisposed = new AtomicBoolean(false);
-
-        ModelMap() {
-            map = new HashMap<String, MetaDataModel>();
-        }
-
-        /**
-         * @param model
-         *            adds model to the map using the given key descriptor
-         */
-        public void put(final MetaDataModel model) {
-            assert !_isDisposed.get();
-            final String key = calculateKey(model);
-            synchronized (this) {
-                map.put(key, model);
-            }
-        }
-
-        /**
-         * @param modelKeyDescriptor
-         * @return MetaDataModel for this ModelKeyDescriptor. May return null.
-         */
-        public MetaDataModel get(final ModelKeyDescriptor modelKeyDescriptor) {
-            assert !_isDisposed.get();
-
-            final String key = calculateKey(modelKeyDescriptor);
-
-            synchronized (this) 
-            {
-                return map.get(key);
-            }
-        }
-
-        /**
-         * @param model
-         *            from the map
-         */
-        public void remove(final MetaDataModel model) {
-            assert !_isDisposed.get();
-            final String key = calculateKey(model);
-            synchronized(this)
-            {
-                map.remove(key);
-            }
-        }
-
-        public void dispose() {
-            if (_isDisposed.compareAndSet(false, true)) {
-                synchronized(this)
-                {
-                    for (final Iterator<Map.Entry<String, MetaDataModel>> it = map.entrySet().iterator(); it.hasNext();) 
-                    {
-                        // System.out.println("kill mmModel: "+model.toString());
-                        final Map.Entry<String, MetaDataModel> entry = it.next();
-                        final MetaDataModel model = entry.getValue();
-
-                        if (model != null)
-                        {
-                            model.cleanup();
-                        }
-                        it.remove();
-                    }
-                }
-            }
-        }
-
-        private String calculateKey(final MetaDataModel model)
-        {
-            return calculateKey(model.getModelKey());
-        }
-
-        private String calculateKey(final ModelKeyDescriptor modelKeyDescriptor)
-        {
-            return modelKeyDescriptor.toString();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
deleted file mode 100644
index f53cdd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
+++ /dev/null
@@ -1,395 +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.common.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-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.MetaDataException;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SearchControl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleResultSet;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
-/**
- * Implements {@link IMetaDataModelMergeAssistant}
- * 
- * Responsible for merging source models into one.  The first model in has subsequent 
- * entities and traits added to it.   
- * 
- * TODO - make locating of existing entities and traits in the merged model more efficient
- * TODO - refactor out Taglibdomain-only aspects of include-group processing 
- *
- */
-public class MetaDataModelMergeAssistantImpl implements
-		IMetaDataModelMergeAssistant {
-	
-	private MetaDataModel mergedModel;
-	private Copier copier;
-	private SimpleEntityQueryVisitorImpl entityVisitor;
-	private SimpleTraitQueryVisitorImpl traitVisitor;
-	private IMetaDataSourceModelProvider provider;
-	
-	/**
-	 * Constructor.   Queries with search control limited to first found.
-	 * @param model
-	 */
-	public MetaDataModelMergeAssistantImpl(MetaDataModel model) {
-		this.mergedModel = model;
-		copier = new Copier();
-		entityVisitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, 
-			HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		traitVisitor = new SimpleTraitQueryVisitorImpl(new SearchControl(1));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getMergedModel()
-	 */
-	public MetaDataModel getMergedModel() {
-		return mergedModel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getSourceModel()
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return provider;
-	}
-
-	public void setSourceModelProvider(IMetaDataSourceModelProvider provider) {
-		this.provider = provider;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntityGroup(org.eclipse.jst.jsf.common.metadata.EntityGroup)
-	 */
-	public void addEntityGroup(EntityGroup entityGroup) {
-		Model model = (Model)getMergedModel().getRoot();
-		if (!isExistingEntityGroup(model, entityGroup)){
-			model.getEntityGroups().add(entityGroup);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntity(org.eclipse.jst.jsf.common.metadata.Entity)
-	 */
-	public boolean addEntity(final Entity entity) {
-		Entity mmEntity = getMergedEntity(entity);
-		if (mmEntity == null){
-			addEntityAsNecessary((Entity)entity.eContainer(), entity);
-			return true;
-		}
-		addIncludeGroupsAsNecessary(mmEntity, entity);
-		return false;
-	}
-
-	public Entity getMergedEntity(Entity queryRoot, String entityKey){		
-		Entity ret = null;
-		SimpleResultSet rs = (SimpleResultSet)entityVisitor.findEntities(queryRoot, entityKey);
-		try {
-			if (! rs.getResults().isEmpty()) 
-				ret = (Entity)rs.getResults().get(0);				
-			rs.close();
-		} catch (MetaDataException e) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedEntity()", e);
-		}
-		return ret;
-	}
-	private void addIncludeGroupsAsNecessary(final Entity mmEntity, final Entity entity) {
-		for (Iterator it=entity.getIncludeGroups().iterator();it.hasNext();){
-			IncludeEntityGroup grp = (IncludeEntityGroup)it.next();
-			boolean found = false;
-			for (Iterator it2=mmEntity.getIncludeGroups().iterator();it2.hasNext();){
-				IncludeEntityGroup grp2 = (IncludeEntityGroup)it2.next();
-				if (grp2.equals(grp)){
-					found = true;
-					break;
-				}
-			}
-			if (!found){//maybe we should clone and add
-				mmEntity.getIncludeGroups().add(grp);
-			}
-		}
-	}
-
-	/**
-	 * Checks to see if the entity (by id) is present in the mergedModel or not.
-	 * If not, it will perform a copy of the entity and it's attributes using
-	 * EcoreUtil.Copier.  
-	 * 
-	 * @param parent
-	 * @param entity
-	 * @return
-	 */
-	private Entity addEntityAsNecessary(final Entity parent, final Entity entity) {		
-		Entity mmParent = null;
-		Entity mmEntity = null;
-		if (parent != null){
-			mmParent = getMergedEntity(parent);
-			if (mmParent == null){
-				mmParent = addEntityAsNecessary((Entity)entity.eContainer(), entity);
-			}
-		}
-		if (mmParent != null){
-			mmEntity = addEntityInternal(mmParent, entity);
-			return mmEntity;
-		}
-		return mmEntity;
-	}
-	
-	private boolean isExistingEntityGroup(Model model, EntityGroup entityGroup) {
-		boolean found = false;
-		for(Iterator it=model.getEntityGroups().iterator();it.hasNext();){
-			if (entityGroup.getId().equals(((EntityGroup)it.next()).getId()))
-				return true;			
-		}
-		return found;
-	}
-
-	private Entity getExistingChildEntity(final Entity parent, final Entity entity) {
-		for(Iterator it=parent.getChildEntities().iterator();it.hasNext();){
-			Entity foundEntity = (Entity)it.next();
-			if (entity.getId().equals(foundEntity.getId()))
-				return foundEntity;			
-		}
-		return null;
-	}
-
-	private /*synchronized*/ Entity addEntityInternal(final Entity parent, final Entity entity) {
-		Entity mmEntity =(Entity)copier.copy(entity);
-		copier.copyReferences();
-		parent.getChildEntities().add(mmEntity);
-		return mmEntity;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addTrait(org.eclipse.jst.jsf.common.metadata.Entity, org.eclipse.jst.jsf.common.metadata.Trait)
-	 */
-	public boolean addTrait(Entity entity, Trait trait) {
-		Entity returnedEntity = getMergedEntity(entity);
-		if (returnedEntity != null){
-			return addTraitAsNecessary(returnedEntity, trait);
-		}
-		return false;
-	}
-	
-
-	private boolean addTraitAsNecessary(Entity mergedEntity, Trait trait) {
-		Trait mmTrait = getMergedTrait(mergedEntity, trait);
-		if (mmTrait == null){			
-			addTraitInternal(mergedEntity, trait);
-			return true;
-
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#setMergeComplete()
-	 */
-	public void setMergeComplete() {
-		Model model = (Model)getMergedModel().getRoot();
-		if (model != null){
-			StandardModelFactory.debug(">> Begin processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD);
-			
-			processIncludeGroups(model);			
-			
-			StandardModelFactory.debug(">> End processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD);
-		}		
-	}
-	
-	/**
-	 * Copies the passed trait and adds it to the merged entity.
-	 * The source model provider of the trait is then set on the trait so that 
-	 * the trait can know where it came from.
-	 * 
-	 * @param parent
-	 * @param trait
-	 * @return merged Trait
-	 */
-	private Trait addTraitInternal(final Entity parent, final Trait trait) {		
-		Trait mmTrait =(Trait)copier.copy(trait);
-		copier.copyReferences();
-		parent.getTraits().add(mmTrait);
-		//set the model key to know from where the trait came
-		mmTrait.setSourceModelProvider(trait.getSourceModelProvider());
-		return mmTrait;
-	}
-
-	/**
-	 * Locates the entity in the merged model matching by id only. 
-	 * If not located, this method returns null;
-	 * 
-	 * @param entity
-	 * @return merged entity
-	 */
-	private Entity getMergedEntity(Entity entity){
-		if (entity instanceof Model)
-			return (Entity)mergedModel.getRoot();
-		
-		Entity ret = null;
-		String entityKey = getIdRelativeToRoot(entity);
-		SimpleResultSet rs = (SimpleResultSet)entityVisitor.findEntities((Entity)mergedModel.getRoot(), entityKey);
-		try {
-			if (! rs.getResults().isEmpty()) 
-				ret = (Entity)rs.getResults().get(0);				
-			rs.close();
-		} catch (MetaDataException e) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedEntity()", e);
-		}
-		return ret;
-	}
-	
-	private String getIdRelativeToRoot(final Entity entity) {
-		Entity e = entity;
-		StringBuffer buf = new StringBuffer();
-		while (e.eContainer() != null){
-			buf.insert(0, e.getId());
-			if (e.eContainer()!=null && e.eContainer().eContainer() != null)
-				buf.insert(0,"/");
-			e = (Entity)e.eContainer();
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Locates the trait in the merged model matching by id only. 
-	 * If not located, this method returns null;
-	 *  
-	 * @param entity
-	 * @param trait
-	 * @return merged Trait
-	 */
-	public Trait getMergedTrait(Entity entity, Trait trait){
-		SimpleResultSet rs = (SimpleResultSet)traitVisitor.findTraits(entity, trait.getId());
-		Trait ret = null;
-		try {
-			if (! rs.getResults().isEmpty()) 
-				ret = (Trait)rs.getResults().get(0);				
-			rs.close();
-		} catch (MetaDataException e) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedTrait()", e);
-		}
-		return ret;
-	}
-
-	private void processIncludeGroups(final Model root) {
-		addEntityGroupReferencesRecursively(root);
-	}
-
-	private void addEntityGroupReferencesRecursively(final Entity entity) {
-		doIncludes(entity);
-		for (int i=0, size=entity.getChildEntities().size();i<size;i++){
-			addEntityGroupReferencesRecursively((Entity)entity.getChildEntities().get(i));
-		}		
-	}
-
-	private void doIncludes(final Entity entity){
-		for (int j=0, groupsSize=entity.getIncludeGroups().size();j<groupsSize; j++){				
-			IncludeEntityGroup include = (IncludeEntityGroup)entity.getIncludeGroups().get(j);				
-			if (include.getId() != null){
-				//is this a local merge?
-				if (include.getModelUri() == null||
-						(include.getModelUri()
-							.equals(getMergedModel()
-								.getModelKey().getUri())) ){
-					EntityGroup eg = ((Model)getMergedModel().getRoot()).findIncludeGroup(include.getId());
-					addIncludeRefs(entity, eg);
-				} else //external model include
-					addIncludeRefs(entity, include);
-			}
-		}
-	}
-	/*
-	 * Adds traits and child entities from an external entity group to the passed entity
-	 * @param entity
-	 * @param include
-	 */
-	private void addIncludeRefs(final Entity entity, final IncludeEntityGroup include) {
-		ITaglibDomainMetaDataModelContext modelContext = new TaglibDomainMetaDataModelContextImpl(				
-				getMergedModel().getModelKey().getDomain(), 
-				getMergedModel().getModelKey().getProject(), 
-				include.getModelUri()
-		);
-		
-		Model externalModel = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		if (externalModel != null){
-			EntityGroup entityGroup = externalModel.findIncludeGroup(include.getId());		
-			addIncludeRefs(entity, entityGroup);
-		}
-		else {
-			JSFCommonPlugin.log(IStatus.ERROR, "Unable to load external metadata model refs for "+modelContext.getURI()
-					+ " into "+ entity.getModel().getCurrentModelContext().getUri());
-		}
-	}
-
-	/*
-	 * Adds traits and child entities from a local entity group to the passed entity if not already present for the entity.
-	 * First 
-	 * @param entity
-	 * @param entityGroup
-	 */
-	private void addIncludeRefs(final Entity entity, final EntityGroup entityGroup) {
-		if (entityGroup == null)
-			return;
-	
-		for (int i=0, size=entityGroup.getTraits().size();i<size;i++){
-			addTrait(entity, (Trait)entityGroup.getTraits().get(i));
-		}
-		
-		for (int i=0, size=entityGroup.getChildEntities().size();i<size;i++){
-			traverseAndAddIncludes(entity, (Entity)entityGroup.getChildEntities().get(i));
-		}
-	}
-	
-	private void traverseAndAddIncludes(final Entity parent, final Entity entity){
-		Entity mergedEntity = addIncludedEntityAsNecessary(parent, entity);
-		
-		for (final Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-			Trait trait = (Trait)it.next();
-			addTraitAsNecessary(mergedEntity, trait);
-		}
-		
-		for (final Iterator/*<EntityKey>*/ it=entity.getChildEntities().iterator();it.hasNext();){
-			Entity e = (Entity)it.next();
-			traverseAndAddIncludes(mergedEntity, e);//add as normal
-		}
-		
-	}
-		
-	/*
-	 * Checks to see if the entity (by id) is present as a child entity in the parent or not.
-	 * If not, it will add the entity to the childEntities without copying.
-	 * 
-	 * @param parent
-	 * @param entity
-	 * @return Entity
-	 */
-	private Entity addIncludedEntityAsNecessary(final Entity parent, final Entity entity) {		
-		Entity mergedEntity = getExistingChildEntity(parent, entity);
-		if (mergedEntity == null){
-			mergedEntity = addEntityInternal(parent, entity);
-		}
-		return mergedEntity;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java
deleted file mode 100644
index dda1cd4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java
+++ /dev/null
@@ -1,73 +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.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Meta data model key descriptor used to lazily load a model when it is required
- *
- */
-public class ModelKeyDescriptor {
-	private final IProject project;
-	private final String domain;
-	private final String uri;
-	private final String key;
-	
-	/**
-	 * Constructor
-	 * @param project
-	 * @param domain
-	 * @param uri
-	 */
-	public ModelKeyDescriptor(IProject project, String domain, String uri){
-		this.project = project;
-		this.domain = domain;
-		this.uri = uri;
-		String proj = project != null ? project.getName() : "Null"; //$NON-NLS-1$
-		StringBuffer buf = new StringBuffer(proj);
-		buf.append(":"); //$NON-NLS-1$
-		buf.append(domain);
-		buf.append(":"); //$NON-NLS-1$
-		buf.append(uri);
-		key = buf.toString();
-	}
-	
-	/**
-	 * @return domain id
-	 */
-	public final String getDomain(){
-		return domain;
-	}
-	
-	/**
-	 * @return model uri
-	 */
-	public final String getUri(){
-		return uri;
-	}
-
-	/**
-	 * @return project
-	 */
-	public final IProject getProject(){
-		return project;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public final String toString(){		
-		return key;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java
deleted file mode 100644
index 34b90b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java
+++ /dev/null
@@ -1,20 +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.common.metadata.internal;
-
-/**
- * Experimental
- *
- */
-public class ModelNotSetException extends Exception {
-	private static final long serialVersionUID = 1L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java
deleted file mode 100644
index eef5937..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java
+++ /dev/null
@@ -1,97 +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.common.metadata.internal;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-
-/**
- * Default implementation of StandardMetaDataSourceFileLocator that will locate standard metadata files
- * and resource bundles relative to the plugin that registered the files using the 
- * <code>org.eclipse.jst.jsf.common.StandardMetaDataFiles</code> ext-pt.
- *
- */
-public class PluginRelativeStandardMetaDataSourceFileLocator extends StandardMetaDataSourceFileLocator{
-	
-	private ResourceBundle resourceBundle;
-
-	/* 
-	 * Returns InputStream of standard metadata file from plugin relative location.
-	 * 	 
-	 */
-	public InputStream getInputStream() throws IOException {
-		URL url = getURL();
-		if (url != null) 
-			return url.openStream();
-		
-        String  fileName = Path.fromOSString(fileInfo.getLocation()).toString() + " (Plugin: " + fileInfo.getBundleId()+")" ;
-        throw new FileNotFoundException("Metadata file not found: "+ fileName);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataSourceFileLocator#getURL()
-	 */
-	public URL getURL() {
-	    final Bundle bundle = Platform.getBundle(fileInfo.getBundleId());
-	    if (bundle == null)
-	    {
-	        return null;
-	    }
-	    final IPath fromOSString = Path.fromOSString(fileInfo.getLocation());
-		return FileLocator.find(bundle, fromOSString, null);
-	}
-
-	
-	/* 
-	 * Returns property resource bundle if it exists.  May return null.
-	 * This implementation assumes that the basename of the bundle is the same 
-	 * as the source file name and in the same directory.
-	 * 
-	 */
-	public ResourceBundle getResourceBundle() throws IOException, MalformedURLException {
-		if (resourceBundle == null){
-			URL bundleURL = getStandardMetaDataSourceFileBasenameURL();
-			if (bundleURL == null)
-				return null;
-			
-			resourceBundle = ResourceBundleHelper.getResourceBundle(bundleURL);
-		}
-		return resourceBundle;
-	}
-	
-	private URL getStandardMetaDataSourceFileBasenameURL()  {
-		IPath annotationPath = Path.fromOSString(fileInfo.getLocation()); 
-		IPath annotationFolder = annotationPath.removeLastSegments(1);
-		IPath propertiesLocation = annotationPath.removeFirstSegments(annotationPath.segmentCount() - 1).removeFileExtension();
-		// append location of properties file
-		IPath propertiesFile = annotationFolder.append(propertiesLocation);
-	
-		// append .properties extension if needed
-		if (propertiesFile.getFileExtension() == null)
-			propertiesFile = propertiesFile.addFileExtension("properties"); //$NON-NLS-1$
-		// create a URL out of the properties file location
-		return FileLocator.find(Platform.getBundle(fileInfo.getBundleId()),
-				propertiesFile, null);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java
deleted file mode 100644
index d96b267..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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
- *     Gerry Kessler/Oracle - copied from org.eclipse.wst.sse.core.internal.encoding.util and modified heavily
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * ResourceBundleHelper
- *
- */
-public final class ResourceBundleHelper {
-
-	/**
-	 * @param resourceURL
-	 * @return ResourceBundle
-	 * @throws MalformedURLException - may return null
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(final URL resourceURL) throws MalformedURLException, IOException {
-		return getResourceBundle(resourceURL, Locale.getDefault());
-	}
-
-	/**
-	 * @param resourceURL
-	 * @param targetLocale
-	 * @return ResourceBundle - may return null
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(final URL resourceURL, final Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURL
-		//
-		final String protocol	= resourceURL.getProtocol();
-		final String host		= resourceURL.getHost();
-		final String file		= resourceURL.getFile();
-		final IPath path 		= new Path(file);
-		
-		String dir = "./";
-		final String bundleName = path.removeFileExtension().segment(path.segmentCount() - 1);
-		if (path.segmentCount() > 1)
-		{
-			dir = path.removeLastSegments(1).toString();
-		}
-
-		// create a class loader with a class path that points to the resource
-		// bundle's location
-		//         
-		final URL[] classpath = new URL[1];
-		classpath[0] = FileLocator.resolve(new URL(protocol, host, dir));
-		// TODO: does this need to be in a doPrivileged block?
-		final ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(bundleName, targetLocale, resourceLoader);
-	}
-	
-	private ResourceBundleHelper()
-	{
-	    // no instantiation
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java
deleted file mode 100644
index 5e6489d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java
+++ /dev/null
@@ -1,75 +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.common.metadata.internal;
-
-/**
- * Contains information about annotation files.  
- */
-public final class StandardMetaDataFileInfo implements IStandardMetaDataSourceInfo{
-		
-	private final String fileLocation;
-	private final String fileLocatorClassname;
-	private final String bundleId;
-
-	/**
-	 * Constructor
-	 * @param fileLocation
-	 * @param bundleId
-	 * @param fileLocatorClassname
-	 */
-	public StandardMetaDataFileInfo( String fileLocation, String bundleId, String fileLocatorClassname) {
-		this.fileLocation = fileLocation.trim();
-		this.bundleId = bundleId.trim();
-		this.fileLocatorClassname = fileLocatorClassname;
-	}
-
-	/**
-	 * Get the location of the annotation file as originally specified.
-	 * 
-	 * @return String
-	 */
-	public String getLocation() {
-		return fileLocation;
-	}
-	
-	/**
-	 * Get the annotation file locator classname that must implement ICMAnnotationSourceFileLocator.
-	 * Can return null or empty string.   Caller should provide default.
-	 * 
-	 * @return String
-	 */
-	public String getLocatorClassname() {
-		return fileLocatorClassname != null ? fileLocatorClassname.trim() : null;
-	}
-
-	/**
-	 * Get the bundle id of the plugin where the annotation file is located.
-	 * 
-	 * @return String
-	 */
-	public String getBundleId() {
-		return bundleId;
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("StandardMetaDataFileInfo");
-		buf.append(": ");
-		buf.append(bundleId);
-		buf.append("/");
-		buf.append(fileLocation);
-		if (getLocatorClassname() != null){
-			buf.append(": ");
-			buf.append(getLocatorClassname());
-		}
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java
deleted file mode 100644
index 4252c8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006, 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 - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-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.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-
-
-/**
- * Registry of standard metadata files
- */
-public final class StandardMetaDataFileRegistry {
-	private Map/*<String, List<IMetaDataSourceModelProvider>>*/ mdFilesMap 	= new HashMap/*<String, List<IMetaDataSourceModelProvider>>*/(1);
-	private List/*<IMetaDataSourceModelProvider>*/ EMPTY_LIST 	= new ArrayList/*<IMetaDataSourceModelProvider>*/(0);
-
-	private static StandardMetaDataFileRegistry reg;
-	
-	/**
-	 * @return the singleton instance of the registry
-	 */
-	public static StandardMetaDataFileRegistry getInstance() {
-		if (reg == null){
-			reg = new StandardMetaDataFileRegistry();
-		}
-		return reg;
-	}
-	
-	private StandardMetaDataFileRegistry() {
-		new StandardMetaDataFileRegistryReader(this).readRegistry();
-	}
-
-	/**
-	 * @param uri as String
-	 * @return list of standard metadata sources as <code>IMetaDataSourceModelProvider</code>s.  
-	 * Returns empty list of no standard metadata files are registered for the given uri.
-	 */
-	public synchronized List/*<IMetaDataSourceModelProvider>*/ getStandardMetaDataModelProviders(String uri) {
-		List/*<IMetaDataSourceModelProvider>*/ theList = (List)mdFilesMap.get(uri);
-		return theList != null ? theList : EMPTY_LIST ;
-	}
-		
-	/**
-	 * For use by registry reader only
-	 * @param uri
-	 * @param fileInfo 
-	 */
-	public synchronized void addStandardMetaDataFileInfo(String uri, IStandardMetaDataSourceInfo fileInfo) {
-		List/*<IMetaDataSourceModelProvider>*/ providers = (List) mdFilesMap.get(uri);
-		if (providers == null) {
-			providers = new ArrayList/*<IStandardMetaDataSourceInfo>*/();
-			mdFilesMap.put(uri, providers);
-		}
-		providers.add(new StandardMetaDataFilesProvider(fileInfo));
-	}	
-	
-/**
- * Internal implementation of IMetaDataSourceModelProvider for "standard" metadata sources
- *
- */
-static class StandardMetaDataFilesProvider implements IMetaDataSourceModelProvider {
-	
-	private org.eclipse.jst.jsf.common.metadata.internal.IStandardMetaDataSourceInfo info;
-	private Object model;
-	private IMetaDataLocator locator;
-	private StandardMetaDataSourceFileLocator fileLocator = null;
-	
-	/**
-	 * Constructor
-	 * @param info
-	 */
-	StandardMetaDataFilesProvider(IStandardMetaDataSourceInfo info){
-		this.info = info;
-	}
-	
-	private StandardMetaDataSourceFileLocator getFileLocator(){
-		if (fileLocator == null){		
-			if (info.getLocatorClassname() == null){
-				fileLocator = new PluginRelativeStandardMetaDataSourceFileLocator();
-			}	
-			else {		
-				Class klass = JSFCommonPlugin.loadClass(info.getLocatorClassname(), info.getBundleId());
-				try {
-					fileLocator = (StandardMetaDataSourceFileLocator)klass.newInstance();
-				} catch (InstantiationException e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "InstantiationException: StandardMetaDataFilesProvider.getFileLocator()", e); //$NON-NLS-1$
-				} catch (IllegalAccessException e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException: StandardMetaDataFilesProvider.getFileLocator()", e);				 //$NON-NLS-1$
-				}			
-			}
-			if (fileLocator != null)
-				fileLocator.setFileInfo(info);
-		}
-		return fileLocator;
-	}
-	
-	private InputStream getInputStream() throws IOException {				
-		if (getFileLocator() != null){
-			return	getFileLocator().getInputStream();			
-		}
-		return null;
-		
-	}
-	
-	private URI getMDFileURI()
-        {
-            try
-            {
-                StandardMetaDataSourceFileLocator fileLocator2 = getFileLocator();
-                if (fileLocator2 != null)
-                {
-                    final URL url = fileLocator2.getURL();
-                    if (url == null)
-                    {
-                        JSFCommonPlugin.log(new RuntimeException(),
-                                "Couldn't locate meta-data file for "
-                                        + fileLocator2.getFileInfo()
-                                                .getLocation());
-                        return null;
-                    }
-
-                    java.net.URI uri = url.toURI();
-                    return URI.createURI(uri.toString());
-                }
-            }
-            catch (URISyntaxException e)
-            {
-                JSFCommonPlugin.log(IStatus.ERROR, "Metadata File Load Error: "
-                        + getFileLocator().getFileInfo().toString()
-                        + ": URISyntaxException: " + e.getMessage());
-            }
-            return null;
-        }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getSourceModel()
-	 */
-	public Object getSourceModel() {
-		if (model != null)
-			return model;
-		
-		InputStream inputStream = null;
-		try {
-			URI uri = getMDFileURI();
-			inputStream = getInputStream();
-			if (inputStream != null && uri != null){
-				EList contents = StandardModelFactory.getInstance().loadStandardFileResource(inputStream, this, uri);
-				//check to see if this is a Model
-				if (contents != null && !contents.isEmpty() &&
-						contents.get(0) instanceof Model){				
-					model = contents.get(0);
-					((Model)model).setSourceModelProvider(this);
-				}
-			}
-		} catch (FileNotFoundException e){
-			JSFCommonPlugin.log(IStatus.ERROR, e.getLocalizedMessage());
-		} catch (IOException e) {
-			JSFCommonPlugin.log(IStatus.ERROR,"IOException(1): StandardMetaDataFilesProvider.getSourceModel():"+getModelName(), e); //$NON-NLS-1$			
-		} finally {
-			if (inputStream != null){
-				try {
-					inputStream.close();
-				} catch (IOException e) {
-					JSFCommonPlugin.log( IStatus.ERROR,"IOException (2): StandardMetaDataFilesProvider.getSourceModel():"+getModelName(), e); //$NON-NLS-1$
-				}
-			}
-		}
-		return model;
-	}
-
-	private String getModelName() {
-		return info.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getLocator()
-	 */
-	public IMetaDataLocator getLocator() {
-		return locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#setLocator(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator)
-	 */
-	public void setLocator(IMetaDataLocator locator) {
-		this.locator = locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getResourceBundle()
-	 */
-	private ResourceBundle internalGetResourceBundle() {
-		if (getFileLocator() != null){
-			try {
-				return fileLocator.getResourceBundle();
-			} catch (MissingResourceException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InternalGetResourceBundle1", e);
-			} catch (IOException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InternalGetResourceBundle2", e);			
-			}
-		}
-		return null;
-	}
-
-	public Object getAdapter(Class klass) {
-		final StandardMetaDataFilesProvider mdp = this;
-		if (klass == IImageDescriptorProvider.class){			
-			return new IImageDescriptorProvider(){
-				String imageBase;
-				public ImageDescriptor getImageDescriptor(String imagePath) {
-					imagePath = appendImageBase(imagePath);
-					String bundleID = mdp.getFileLocator().getFileInfo().getBundleId();
-					URL url = FileLocator.find(Platform.getBundle(bundleID), new Path(imagePath), null);
-					return ImageDescriptor.createFromURL(url);
-				}
-				private String appendImageBase(String imagePath) {
-					return getImageBase() + imagePath;
-				}
-				
-				private String getImageBase(){
-					if (imageBase == null){
-						Model aModel = (Model)getSourceModel();
-						Trait t = TaglibDomainMetaDataQueryHelper.getTrait(aModel, "images-base-path"); //$NON-NLS-1$
-						if (t == null){
-							imageBase = "";		 //$NON-NLS-1$
-						} else {
-							imageBase = TraitValueHelper.getValueAsString(t);
-							if (imageBase != null && imageBase.length() > 0){
-								imageBase = imageBase +"/"; //$NON-NLS-1$
-							}
-						}
-					}
-					return imageBase;
-				}
-				
-			};
-		
-		} else if (klass == IResourceBundleProvider.class) {
-			return new IResourceBundleProvider(){
-
-				public ResourceBundle getResourceBundle() {
-					return mdp.internalGetResourceBundle();
-				}
-				
-			};
-			
-		} else if (klass == IClassLoaderProvider.class){
-			return new IClassLoaderProvider(){
-
-				public Class loadClass(String className) {
-					String bundleID = mdp.getFileLocator().getFileInfo().getBundleId();
-					try {
-						return Platform.getBundle(bundleID).loadClass(className);
-					} catch (ClassNotFoundException e) {
-						return null;
-					}
-				}
-				
-			};
-		} else if (klass == IResourceURLProvider.class) {
-			return new IResourceURLProvider() {
-
-				public URL getResourceURL(String resourcePath) {
-					URL resourceURL = null;
-					String bundleID = mdp.getFileLocator().getFileInfo().getBundleId();
-					try {
-						resourceURL = FileLocator.resolve(Platform.getBundle(bundleID).getResource(resourcePath));
-					} catch (IOException ioe) {
-						//do nothing, will return null resourceURL
-					}
-					return resourceURL;
-				}
-
-			};
-		}
-		return null;
-	}
-
-}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java
deleted file mode 100644
index a6b051b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006, 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 - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-
-/**
- * This class reads the standardMetaDataFiles extensions adds each specified standard metadata
- * file to the StandardMetaDataFileRegistry.
- * 
- * @see StandardMetaDataFileRegistry
- * also see StandardMetaDataFile extension-point
- */
-public class StandardMetaDataFileRegistryReader {
-	/**
-	 * EXTENSION POINT ID
-	 */
-	protected static final String EXTENSION_POINT_ID = "standardMetaDataFiles"; //$NON-NLS-1$
-	/**
-	 * IConfigurationElement element name
-	 */
-	protected static final String TAG_NAME = "StandardMetaDataFile"; //$NON-NLS-1$
-	/**
-	 * Uri attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_URI = "uri"; //$NON-NLS-1$
-	/**
-	 * Location attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_LOCATION = "location"; //$NON-NLS-1$
-	/**
-	 * Locator attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_LOCATOR = "locator"; //$NON-NLS-1$
-
-	private StandardMetaDataFileRegistry annotationFileRegistry;
-
-	/**
-	 * Constructor
-	 * @param registry
-	 */
-	public StandardMetaDataFileRegistryReader(StandardMetaDataFileRegistry registry) {
-		this.annotationFileRegistry = registry;
-	}
-
-	/**
-	 * read the registery
-	 */
-	public void readRegistry() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				readElement(elements[i]);
-			}
-		}
-	}
-
-	private void readElement(IConfigurationElement element) {
-		if (element.getName().equalsIgnoreCase(TAG_NAME)) {
-			String uri = element.getAttribute(ATT_URI);
-			String location = element.getAttribute(ATT_LOCATION);
-			String locator = element.getAttribute(ATT_LOCATOR);
-			String bundleId = null;
-			if (uri != null && location != null) {
-				try {
-					bundleId = element.getContributor().getName();
-					StandardMetaDataFileInfo fileInfo = new StandardMetaDataFileInfo(location, bundleId, locator);
-					annotationFileRegistry.addStandardMetaDataFileInfo(uri, fileInfo);
-				}
-				catch (Exception e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: exception occurred while reading StandardMetaDataFile ext-pt: "+location + ":"+uri, e); //$NON-NLS-1$		}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
deleted file mode 100644
index 4a4efdd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
+++ /dev/null
@@ -1,86 +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.common.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFileRegistry.StandardMetaDataFilesProvider;
-
-
-/**
- * A 'null' translation of a metadata file.  Entities and traits are not transformed.
- *
- */
-public class StandardMetaDataFilesTranslator implements IMetaDataTranslator {
-
-	public boolean canTranslate(IMetaDataSourceModelProvider modelProvider) {
-		if (modelProvider instanceof StandardMetaDataFilesProvider)
-			return true;
-		return false;
-	}
-	
-	public void translate(IMetaDataModelMergeAssistant assistant) {//TODO: throw proper errors
-		//null translate - sourceModel object are already Entities and traits
-		//traverse the tree and add to model
-		
-		//temp - throw proper errors 
-		//assert assistant.getSourceModel() instanceof ModelKeyDescriptor;
-		
-		MetaDataModel mm = assistant.getMergedModel();
-		if (mm.getRoot() == null)
-			mm.setRoot(assistant.getSourceModelProvider().getSourceModel());
-		
-		else {
-			//for each entity and trait call "add".   assistant will handle merge.
-			Model mk = (Model)assistant.getSourceModelProvider().getSourceModel();
-			if (mk != null) {//possible that model was not loaded 
-				traverseAndAdd(assistant, mk);
-			} else if (StandardModelFactory.DEBUG_MD_LOAD) {
-				JSFCommonPlugin.log(IStatus.ERROR,"Unable to load source model: "+assistant.getSourceModelProvider());
-			}
-		}			
-	}
-	
-	/**
-	 * Add entity and any children
-	 * @param assistant
-	 * @param entity
-	 */
-	protected void traverseAndAdd(IMetaDataModelMergeAssistant assistant, final Entity entity){
-		assistant.addEntity(entity);
-		
-		if (entity instanceof Model){
-			Model model = (Model)entity;
-			for (final Iterator/*EntityGroup*/ it=model.getEntityGroups().iterator();it.hasNext();){
-				assistant.addEntityGroup((EntityGroup)it.next());
-			}
-		}
-		
-		for (final Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-			Trait trait = (Trait)it.next();
-			assistant.addTrait(entity, trait);
-		}
-		
-		for (final Iterator/*<EntityKey>*/ it=entity.getChildEntities().iterator();it.hasNext();){
-			Entity e = (Entity)it.next();
-			traverseAndAdd(assistant, e);
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java
deleted file mode 100644
index fd3e3ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java
+++ /dev/null
@@ -1,46 +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.common.metadata.internal;
-
-import java.util.List;
-
-
-/**
- * Implementation of IMetaDataLocator for standard metadata sources.
- * Uses StandardMetaDataFileRegistry to locate instances.
- *
- */
-public class StandardMetaDataLocator extends AbstractMetaDataLocator {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#locateMetaDataModelProviders(java.lang.String)
-	 */
-	public List locateMetaDataModelProviders(String uri) {
-		return StandardMetaDataFileRegistry.getInstance().getStandardMetaDataModelProviders(uri);
-	}
-
-	/* 
-	 * Does nothing.
-	 */
-	public void startLocating() {
-		//do nothing
-	}
-
-	/* 
-	 * Does nothing.
-	 */
-	public void stopLocating() {
-		//do nothing
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java
deleted file mode 100644
index e65d0da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java
+++ /dev/null
@@ -1,74 +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.common.metadata.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-
-/**
- * Used to supply an InputStream to the parser of an annotation 
- * meta-data file and the URL to the resource bundle for a properties file, if any.
- * 
- * Implementors must provide a zero-argument constructor.
- * 
- * CURRENTLY INTERNAL... WILL BE MADE API AT SOME POINT
- *
- */ 
-public abstract class StandardMetaDataSourceFileLocator {
-	/**
-	 * metadata file to locate
-	 */
-	protected IStandardMetaDataSourceInfo fileInfo;
-	
-	/**
-	 * Set the <code>IStandardMetaDataSourceInfo</code> for this locator
-	 * @param fileInfo
-	 */
-	public final void setFileInfo(IStandardMetaDataSourceInfo fileInfo){
-		this.fileInfo = fileInfo;
-	}
-	
-	/**
-	 * @return the <code>IStandardMetaDataSourceInfo</code> for this locator
-	 */
-	protected final IStandardMetaDataSourceInfo getFileInfo(){
-		return fileInfo;
-	}
-	/**
-	 * Return InputStream to the meta-data source file.  
-	 * Callers are responsible for closing the stream.
-	 * @return InputStream
-	 * @throws IOException
-	 */
-	public abstract InputStream getInputStream() throws IOException;
-	
-	/**
-	 * Return URL to the meta-data source file.  
- 
-	 * @return URL or null if cannot find a the file for getFileInfo
-	 */
-	public abstract URL getURL();
-	
-	/**
-	 * Return ResourceBundle for the property files if there are any.  Return null if not.
-	 * 
-	 * @return java.util.ResourceBundle
-	 * @throws IOException
-	 * @throws MissingResourceException
-	 */
-	public abstract ResourceBundle getResourceBundle() throws IOException, MissingResourceException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java
deleted file mode 100644
index 7f7c249..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java
+++ /dev/null
@@ -1,293 +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.common.metadata.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.EList;
-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.ClassNotFoundException;
-import org.eclipse.emf.ecore.xmi.FeatureNotFoundException;
-import org.eclipse.emf.ecore.xmi.IllegalValueException;
-import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
-import org.eclipse.emf.ecore.xmi.UnresolvedReferenceException;
-import org.eclipse.emf.ecore.xmi.XMIException;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.internal.util.MetadataResourceImpl;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Singleton that produces and loads standard metadata models.  
- * All models are loaded into the same ResourceSet.
- * <p>
- * All metadata extension models must be registered with org.eclipse.emf.ecore.generated_package extension-point.
- * No other mechanism is provided for model uri resolution.
- * <p>
- * Debug tracing for model loading is available: <code>org.eclipse.jst.jsf.common/debug/metadataload=true</code>
- * <p>
- * When the /debug/metadataload trace flag is set, and in case extension models are known not to be available, 
- * and metadata is referencing those models, error logging can be suppressed by launching with the following properties set:<br>
- * &nbsp;&nbsp;&nbsp;metadata.package.ignores<br>
- * &nbsp;&nbsp;&nbsp;metadata.classname.ignores
- *  <p>
- *  eg. Usage for when WPE is not present<p>
- *  <code>
- 	-Dmetadata.package.ignores=http://org.eclipse.jsf.pagedesigner/dtinfo.ecore,<br>http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore<br>
- 	-Dmetadata.classname.ignores=DTInfo,QuickEditTabSections<br>
- *  </code>
- * <p>
- * see {@link Model}
- */
-public class StandardModelFactory {
-	private static StandardModelFactory INSTANCE;
-	static boolean DEBUG_MD_LOAD = false;
-	static boolean DEBUG_MD_GET = false;
-	private ExtendedMetaData extendedMetaData;
-	private ResourceSet resourceSet;
-
-	
-	/**
-	 * @return singleton instance of the metadata model factory
-	 */
-	public synchronized static StandardModelFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new StandardModelFactory();
-			INSTANCE.init();	
-			
-			if (JSFCommonPlugin.getPlugin().isDebugging()){
-				DEBUG_MD_LOAD = Boolean.valueOf(Platform.getDebugOption(JSFCommonPlugin.PLUGIN_ID+"/debug/metadataload")).booleanValue();//$NON-NLS-1$
-				DEBUG_MD_GET  = Boolean.valueOf(Platform.getDebugOption(JSFCommonPlugin.PLUGIN_ID+"/debug/metadataget")).booleanValue();//$NON-NLS-1$
-			}
-		}
-		return INSTANCE;
-	}
-	
-	private void init() {
-		resourceSet = new ResourceSetImpl();
-		
-	    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());
-		
-		//relying on the org.eclipse.emf.ecore.generated_package ext-pt to register traits
-	}
-
-	private StandardModelFactory() {		
-		super();
-	}
-	
-	/**
-	 * Factory method that probably belongs somewhere else!
-	 * @param key
-	 * @param strategy
-	 * @return an empty MetaDataModel
-	 */
-	public MetaDataModel createModel(ModelKeyDescriptor key, IDomainLoadingStrategy strategy){
-		return new MetaDataModel(key, strategy);
-	}
-
-	/**
-	 * Factory method that probably belongs somewhere else!
-	 * @param modelContext 
-	 * @return a ModelKeyDescriptor for the context
-	 */
-	public ModelKeyDescriptor createModelKeyDescriptor(final ITaglibDomainMetaDataModelContext modelContext) {
-		return new ModelKeyDescriptor(modelContext.getProject(), modelContext.getDomainID(), modelContext.getURI());
-	}
-	
-	/**
-	 * @param inputStream
-	 * @param provider
-	 * @param uri 
-	 * @return the root of the standard model from the resource as an EList
-	 * @throws IOException
-	 */
-	public EList loadStandardFileResource(final InputStream inputStream,
-            final IMetaDataSourceModelProvider provider,
-            final org.eclipse.emf.common.util.URI uri) throws IOException
-    {
-        final XMLResource res = new MetadataResourceImpl(provider);
-        
-        debug(String.format(
-                ">>> Loading standard meta-data file for uri %s", uri), DEBUG_MD_LOAD); //$NON-NLS-1$
-        
-        res.setURI(uri);
-        resourceSet.getResources().add(res);
-        setLoadOptions(res);
-        res.load(inputStream, null);
-        if (DEBUG_MD_LOAD)
-        {
-            reportErrors(res);
-        }
-        final EList root = res.getContents();
-        return root;
-    }
-
-	private void reportErrors(Resource res) {
-		EList<Resource.Diagnostic> errs = res.getErrors();
-		if (! errs.isEmpty()){
-			for (Iterator<Resource.Diagnostic> it= errs.iterator();it.hasNext();){
-				StandardModelErrorMessageFactory.logErrorMessage(it.next());
-			}
-		}
-	}
-	
-	/**
-	 * Sets default load options for the resource
-	 * @param resource 
-	 */
-	protected void setLoadOptions(XMLResource resource) {
-		Map options = resource.getDefaultLoadOptions();
-//		options.put(XMLResource.OPTION_SAVE_TYPE_INFORMATION, true);
-		options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-		options.put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
-		options.put(XMLResource.OPTION_RESOURCE_HANDLER, resource);
-		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.
-//		options.put(XMLResource.OPTION_DOM_USE_NAMESPACES_IN_SCOPE, Boolean.TRUE);
-		
-//		if (DEBUG_MD_LOAD)
-//		{
-//		    System.out.println("Using load options: "+options);
-//		}
-	}
-
-
-	static class StandardModelErrorMessageFactory {
-		private static List<String> _missingPackageURIs;
-		private static List<String> _missingClassnames;
-		
-		/**
-		 * Simply logs all messages against JSFCommonPlugin, for now.
-		 * @param diagnostic
-		 */
-		public static void logErrorMessage(Resource.Diagnostic diagnostic) {	
-			//should be XMIException
-			if (diagnostic instanceof XMIException) {
-				XMIException ex = (XMIException)diagnostic;				
-				String msg = createMessage(ex);
-				if (msg != null)
-					JSFCommonPlugin.log(IStatus.ERROR, msg);
-			}
-			else {
-				JSFCommonPlugin.log(IStatus.ERROR, diagnostic.toString());//do better???
-			}
-		}
-
-		private static String createMessage(XMIException ex) {
-			
-			StringBuffer buf = new StringBuffer("Metadata Load Error: ") //$NON-NLS-1$
-				.append(ex.getClass().getSimpleName()).append(": "); //$NON-NLS-1$
-			
-			if (ex instanceof PackageNotFoundException) {				
-				if (shouldIgnore(ex)) 
-					return null;
-				
-				buf.append(((PackageNotFoundException)ex).uri());			
-			} 
-			else if (ex instanceof ClassNotFoundException) {
-				if (shouldIgnore(ex)) 
-					return null;
-				
-				buf.append(((ClassNotFoundException)ex).getName());
-			}
-			else if (ex instanceof FeatureNotFoundException)
-				buf.append(((FeatureNotFoundException)ex).getName());
-			else if (ex instanceof IllegalValueException)
-				buf.append(((IllegalValueException)ex).getValue().toString());
-			else if (ex instanceof UnresolvedReferenceException)
-				buf.append(((UnresolvedReferenceException)ex).getReference());	
-			else
-				buf.append(ex.getMessage());
-			
-			buf.append(" in ").append(ex.getLocation()).append(": Line = ") //$NON-NLS-1$ //$NON-NLS-2$
-				.append(ex.getLine()).append(": Column = ").append(ex.getColumn()); //$NON-NLS-1$
-			return buf.toString();
-		}
-
-		private static boolean shouldIgnore(XMIException ex) {
-			if (ex instanceof PackageNotFoundException) {
-				String uri = ((PackageNotFoundException)ex).uri();
-				return getMissingPackageURIs().contains(uri);
-			}
-			else if (ex instanceof ClassNotFoundException) {
-				String className = ((ClassNotFoundException)ex).getName();
-				return getMissingClassnames().contains(className);
-			}
-			return false;
-		}
-
-		private static List<String> getMissingPackageURIs() {
-			if (_missingPackageURIs == null) {
-				_missingPackageURIs = buildList("metadata.package.ignores"); //$NON-NLS-1$
-
-			}
-			return _missingPackageURIs;
-		}
-		
-		private static List<String> getMissingClassnames() {
-			if (_missingClassnames == null) {
-				_missingClassnames = buildList("metadata.classname.ignores"); //$NON-NLS-1$
-			}
-			return _missingClassnames;
-		}
-
-		private static List<String> buildList(String propertyName) {
-			List<String> ret = new ArrayList<String>();
-			String ignoreSet = System.getProperty(propertyName);
-			if (ignoreSet == null )//try env
-				ignoreSet = System.getenv(propertyName);
-			
-			if (ignoreSet != null && !(ignoreSet.equals(""))){ //$NON-NLS-1$
-				StringTokenizer st = new StringTokenizer(ignoreSet, ","); //$NON-NLS-1$
-				while(st.hasMoreTokens()){
-					String uri = st.nextToken();
-					if (!(uri.equals("")))
-							ret.add(uri);
-				}
-			}
-
-			return ret;
-		}
-		 
-	}
-	
-	/**
-	 * Debug output.  The parenthesis shows thread id.
-	 * @param msg
-	 * @param debugFlag
-	 */
-	public static void debug(String msg, boolean debugFlag) {
-		if (debugFlag)
-			System.out.println(msg + "["+Thread.currentThread().getId()+"]"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java
deleted file mode 100644
index 040c506..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java
+++ /dev/null
@@ -1,62 +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.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Simple implementation of {@link ITaglibDomainMetaDataModelContext}
- */
-public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextImpl implements ITaglibDomainMetaDataModelContext, Cloneable
-{
-	private final IProject _project;
-	private final String _uri;
-	
-	/**
-	 * Constructor
-	 * @param project
-	 * @param domain
-	 * @param uri
-	 */
-	public TaglibDomainMetaDataModelContextImpl(final String domain, final IProject project, final String uri){
-		super(domain);
-		this._project = project;
-		this._uri = uri;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext#getProject()
-	 */
-	public IProject getProject() {		
-		return _project;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext#getURI()
-	 */
-	public String getURI() {
-		return _uri;
-	}
-	
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(ITaglibDomainMetaDataModelContext.class))
-			return this;
-		
-		return super.getAdapter(adapter);
-	}
-
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        return super.clone();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java
deleted file mode 100644
index 272e10e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java
+++ /dev/null
@@ -1,201 +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.common.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.BasicEObjectImpl;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Experimental/prototype class to assist with decoding trait values.
- * This could/should be made API at some point after "hardening". (https://bugs.eclipse.org/bugs/show_bug.cgi?id=192052) 
- */
-public class TraitValueHelper {
-	private static final String KEY_NOT_FOUND = Messages.Key_not_found;
-	/**
-	 * @param trait
-	 * @return EClass of trait value
-	 */
-	public static EClass getValueType(Trait trait){
-		if (trait == null)
-			return null;
-		if (trait.getValue() != null)
-			return trait.getValue().eClass();
-		return null;
-	}
-	
-	/**
-	 * @param trait
-	 * @return value of trait as String Object.  
-	 */
-	public static Object getValue(Trait trait){
-		if (trait == null)
-			return null;
-		if (trait.getValue() == null)
-			return null;
-		
-		if (trait.getValue() instanceof SimpleAnyType){
-			return ((SimpleAnyType)trait.getValue()).getRawValue();
-		}
-		else if (trait.getValue() instanceof AnyType){
-			AnyType any = (AnyType)trait.getValue();
-			FeatureMap map = any.getMixed();			
-			return getTextValueFromFeatureMap(map);
-		}
-		else if ( trait.getValue().eIsProxy() && trait.getValue() instanceof BasicEObjectImpl){
-			BasicEObjectImpl o = (BasicEObjectImpl)trait.getValue();
-			return o.eProxyURI().toString();
-		}
-		return trait.getValue();
-	}
-	
-	private static String getTextValueFromFeatureMap(FeatureMap map) {
-		for (Iterator it=map.iterator();it.hasNext();){
-			FeatureMap.Entry entry = (FeatureMap.Entry)it.next();
-			if (entry.getEStructuralFeature().getName().equals("text"))		
-				return (String)entry.getValue();
-		}
-		return null;
-	}
-
-	/**
-	 * @param trait
-	 * @return value of trait as String.  If externalized, will resolve from resource bundle.
-	 */
-	public static String getValueAsString(Trait trait){
-		Object val = getValue(trait);
-		if (val instanceof String){			
-			String result = getNLSValue(trait, (String)val);
-			return result;
-		}
-		return null;
-	}
-	
-	/**
-	 * 
-	 * @param trait whose value a {@link ListOfValues} or is a single string
-	 * @return List of Strings.  If externalized, will resolve from resource bundle 
-	 * using getNLSValue(Trait trait, String rawValue)
-	 */
-	public synchronized static List getValueAsListOfStrings(Trait trait){
-		//PROTO ONLY!!! Need to make WAY more robust!
-		List ret = new ArrayList();
-		if (trait.getValue() instanceof ListOfValues) {
-			for(Iterator it=trait.getValue().eContents().iterator();it.hasNext();){
-				Object o = it.next();				
-				if (o instanceof SimpleAnyType){
-					SimpleAnyType sat = (SimpleAnyType)o;
-					String rawValue = getTextValueFromFeatureMap(sat.getMixed());
-					String nlsValue = getNLSValue(trait, rawValue);
-					
-					ret.add(nlsValue);
-				}	
-			}
-		} 
-		else {
-			//may be single value
-			String o = getValueAsString(trait);
-			if (o != null)
-				ret.add(o);
-		}
-		return ret;
-	}
-	
-	/**
-	 * Looks for '%' (and not '%%') at beginning of rawValue.   If found, looks to the
-	 * traits sourceModelProvider for resource bundle to resolve the key after 
-	 * stripping the '%' sign.
-	 * @param trait
-	 * @param rawValue of string in from metadata
-	 * @return the NLS Value or rawValue if it cannot be located
-	 */
-	public static String getNLSValue(Trait trait, String rawValue) {
-		String result = rawValue;
-		if (rawValue.startsWith("%") && !rawValue.startsWith("%%")){ 
-			String key = rawValue.substring(1);
-			result = getNLSPropertyValue(trait, key);	
-			if (result == null){
-				result = rawValue;
-			}
-		}
-		return result == null ? null : result.trim();
-	}
-
-	//will return null if there is an IOException with ResourceBundle
-	private static String getNLSPropertyValue(final Trait trait, final String key){
-		try{			
-			IMetaDataSourceModelProvider provider = trait.getSourceModelProvider();
-			IResourceBundleProvider resourceBundleProvider = (IResourceBundleProvider)provider.getAdapter(IResourceBundleProvider.class);		
-			if (resourceBundleProvider != null){
-				ResourceBundle resourceBundle_ = resourceBundleProvider.getResourceBundle();				
-				if (resourceBundle_ != null){
-					String replVal = resourceBundle_.getString(key);
-					return replVal;
-				}				
-			}
-			//return original string 
-			return key; 
-
-		} catch (MissingResourceException e){
-			//fall thru
-			JSFCommonPlugin.log(e,  NLS.bind(Messages.MissingResource_exception, new String[]{key}));
-		}
-		return key + KEY_NOT_FOUND;
-	}
-
-	/**
-	 * Will take get the value as a String and attempt to coerce to boolean.
-	 * Will return 'false' if coercion fails, or value was null.
-	 * @param trait
-	 * @return true or false 
-	 */
-	public static boolean getValueAsBoolean(Trait trait) {
-		String val = getValueAsString(trait);
-		if (val == null)
-			return false;
-		
-		return Boolean.valueOf(val).booleanValue();
-	}
-	
-//	/**
-//	 * @param trait
-//	 * @return name of class or primitive datatype that the value is defined as.   
-//	 * For SimpleAnyTypes, the getInstanceType().getInstanceClassName() is returned.
-//	 * For AnyType, java.lang.String is always returned.
-//	 * For all others, the class.getName() is returned.
-//	 */
-//	public static String getValueInstanceClassName(Trait trait) {String.class.getName();
-//		if (trait.getValue() instanceof SimpleAnyType) {
-//			return ((SimpleAnyType)trait.getValue()).getInstanceType().getInstanceClassName();
-//		}
-//		else if (trait.getValue() instanceof AnyType) {
-//			return String.class.getName();
-//		}
-//		else {
-//			return trait.getValue().getClass().getName();
-//		}
-//		
-//	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java
deleted file mode 100644
index f9fc4de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EntityGroupImpl.java,v 1.5 2008/02/01 20:20:47 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Entity Group</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-@SuppressWarnings("hiding")
-public class EntityGroupImpl extends EntityImpl implements EntityGroup {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EntityGroupImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.ENTITY_GROUP;
-	}
-
-} //EntityGroupImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java
deleted file mode 100644
index 22cd970..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EntityImpl.java,v 1.6 2007/06/11 20:55:58 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.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.EObject;
-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.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-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.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Entity</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getChildEntities <em>Child Entities</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getTraits <em>Traits</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getIncludeGroups <em>Include Groups</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class EntityImpl extends EObjectImpl implements Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getChildEntities() <em>Child Entities</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChildEntities()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList childEntities = null;
-
-	/**
-	 * The cached value of the '{@link #getTraits() <em>Traits</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTraits()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList traits = null;
-
-	/**
-	 * 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 String TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected String type = TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getIncludeGroups() <em>Include Groups</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIncludeGroups()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList includeGroups = null;
-
-	/**
-	 * The cached value of the Model
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Model _model;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EntityImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.ENTITY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getChildEntities() {
-		if (childEntities == null) {
-			childEntities = new EObjectContainmentEList(Entity.class, this, MetadataPackage.ENTITY__CHILD_ENTITIES);
-		}
-		return childEntities;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTraits() {
-		if (traits == null) {
-			traits = new EObjectContainmentEList(Trait.class, this, MetadataPackage.ENTITY__TRAITS);
-		}
-		return traits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIncludeGroups() {
-		if (includeGroups == null) {
-			includeGroups = new EObjectResolvingEList(IncludeEntityGroup.class, this, MetadataPackage.ENTITY__INCLUDE_GROUPS);
-		}
-		return includeGroups;
-	}
-
-	/**
-	 * <!-- 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, MetadataPackage.ENTITY__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(String newType) {
-		String oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.ENTITY__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void accept(IEntityVisitor visitor) {
-		if (visitor.stopVisiting())
-			return;
-		visitor.visit(this);
-		
-		if (!getChildEntities().isEmpty()){
-			for (Iterator/*<Entity>*/ it = getChildEntities().iterator(); it.hasNext();){
-				Entity k = (Entity)it.next();
-				k.accept(visitor);
-				if (visitor.stopVisiting())
-					return;
-			}
-		}
-//		if (!getIncludeGroups().isEmpty()){
-//			for (Iterator/*<IncludeEntityGroup>*/ it = getIncludeGroups().iterator(); it.hasNext();){
-//				IncludeEntityGroup entityGroup = (IncludeEntityGroup)it.next();
-//				Model m = getModel(entityGroup);
-//				if (m != null){
-//					Entity k = m.findIncludeGroup(entityGroup.getId());
-//					if (k != null){
-//						k.accept(visitor);
-//						if (visitor.stopVisiting())
-//							return;
-//					}
-//				}
-//			}
-//		}
-		visitor.visitCompleted(this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Model getModel() {
-		if (_model == null){
-			EObject parent = this.eContainer();
-			while (true){				
-				if (parent instanceof Model){
-					_model = (Model)parent;
-					break;
-				}
-				if (parent != null)
-					parent = parent.eContainer();
-				else
-					break;
-			}
-		}
-		return _model;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return ((InternalEList)getChildEntities()).basicRemove(otherEnd, msgs);
-			case MetadataPackage.ENTITY__TRAITS:
-				return ((InternalEList)getTraits()).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 MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return getChildEntities();
-			case MetadataPackage.ENTITY__TRAITS:
-				return getTraits();
-			case MetadataPackage.ENTITY__ID:
-				return getId();
-			case MetadataPackage.ENTITY__TYPE:
-				return getType();
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				return getIncludeGroups();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				getChildEntities().clear();
-				getChildEntities().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.ENTITY__TRAITS:
-				getTraits().clear();
-				getTraits().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.ENTITY__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.ENTITY__TYPE:
-				setType((String)newValue);
-				return;
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				getIncludeGroups().clear();
-				getIncludeGroups().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				getChildEntities().clear();
-				return;
-			case MetadataPackage.ENTITY__TRAITS:
-				getTraits().clear();
-				return;
-			case MetadataPackage.ENTITY__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.ENTITY__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				getIncludeGroups().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return childEntities != null && !childEntities.isEmpty();
-			case MetadataPackage.ENTITY__TRAITS:
-				return traits != null && !traits.isEmpty();
-			case MetadataPackage.ENTITY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.ENTITY__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				return includeGroups != null && !includeGroups.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: ");
-		result.append(id);
-		result.append(", type: ");
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-} //EntityImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java
deleted file mode 100644
index 0f8cee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IncludeEntityGroupImpl.java,v 1.2 2007/04/16 19:54:10 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.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.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Include Entity Group</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl#getModelUri <em>Model Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IncludeEntityGroupImpl extends EObjectImpl implements IncludeEntityGroup {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * 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 #getModelUri() <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getModelUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MODEL_URI_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getModelUri() <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getModelUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected String modelUri = MODEL_URI_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IncludeEntityGroupImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.INCLUDE_ENTITY_GROUP;
-	}
-
-	/**
-	 * <!-- 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, MetadataPackage.INCLUDE_ENTITY_GROUP__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getModelUri() {
-		return modelUri;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setModelUri(String newModelUri) {
-		String oldModelUri = modelUri;
-		modelUri = newModelUri;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI, oldModelUri, modelUri));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				return getId();
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				return getModelUri();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				setModelUri((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				setModelUri(MODEL_URI_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				return MODEL_URI_EDEFAULT == null ? modelUri != null : !MODEL_URI_EDEFAULT.equals(modelUri);
-		}
-		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: ");
-		result.append(id);
-		result.append(", modelUri: ");
-		result.append(modelUri);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IncludeEntityGroupImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java
deleted file mode 100644
index ca04307..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataFactoryImpl.java,v 1.4 2007/05/11 17:54:55 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.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.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-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.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataFactoryImpl extends EFactoryImpl implements MetadataFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataFactory
-	 * @generated
-	 */
-	public static MetadataFactory init() {
-		try {
-			MetadataFactory theMetadataFactory = (MetadataFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"); 
-			if (theMetadataFactory != null) {
-				return theMetadataFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new MetadataFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case MetadataPackage.MODEL: return createModel();
-			case MetadataPackage.ENTITY_GROUP: return createEntityGroup();
-			case MetadataPackage.ENTITY: return createEntity();
-			case MetadataPackage.TRAIT: return createTrait();
-			case MetadataPackage.INCLUDE_ENTITY_GROUP: return createIncludeEntityGroup();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case MetadataPackage.IMETA_DATA_SOURCE_MODEL_PROVIDER:
-				return createIMetaDataSourceModelProviderFromString(eDataType, initialValue);
-			case MetadataPackage.MODEL_CONTEXT:
-				return createModelContextFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case MetadataPackage.IMETA_DATA_SOURCE_MODEL_PROVIDER:
-				return convertIMetaDataSourceModelProviderToString(eDataType, instanceValue);
-			case MetadataPackage.MODEL_CONTEXT:
-				return convertModelContextToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Trait createTrait() {
-		TraitImpl trait = new TraitImpl();
-		return trait;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IncludeEntityGroup createIncludeEntityGroup() {
-		IncludeEntityGroupImpl includeEntityGroup = new IncludeEntityGroupImpl();
-		return includeEntityGroup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Model createModel() {
-		ModelImpl model = new ModelImpl();
-		return model;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Entity createEntity() {
-		EntityImpl entity = new EntityImpl();
-		return entity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityGroup createEntityGroup() {
-		EntityGroupImpl entityGroup = new EntityGroupImpl();
-		return entityGroup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType IMetaDataSourceModelProvider
-	 * @param initialValue 
-	 * @return IMetaDataSourceModelProvider
-	 * @generated
-	 */
-	public IMetaDataSourceModelProvider createIMetaDataSourceModelProviderFromString(EDataType eDataType, String initialValue) {
-		return (IMetaDataSourceModelProvider)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return String
-	 * @generated
-	 */
-	public String convertIMetaDataSourceModelProviderToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return ModelKeyDescriptor
-	 * @generated
-	 */
-	public ModelKeyDescriptor createModelContextFromString(EDataType eDataType, String initialValue) {
-		return (ModelKeyDescriptor)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return String
-	 * @generated
-	 */
-	public String convertModelContextToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataPackage getMetadataPackage() {
-		return (MetadataPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataPackage
-	 * @deprecated
-	 * @generated
-	 */
-	public static MetadataPackage getPackage() {
-		return MetadataPackage.eINSTANCE;
-	}
-
-} //MetadataFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java
deleted file mode 100644
index 7f9d582..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataPackageImpl.java,v 1.6 2007/05/11 17:54:55 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-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.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataPackageImpl extends EPackageImpl implements MetadataPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass traitEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass includeEntityGroupEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass modelEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass entityEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass entityGroupEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iTraitVisitorEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iEntityVisitorEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iMetaDataSourceModelProviderEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType modelContextEDataType = 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.common.metadata.MetadataPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private MetadataPackageImpl() {
-		super(eNS_URI, MetadataFactory.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 -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataPackage
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static MetadataPackage init() {
-		if (isInited) return (MetadataPackage)EPackage.Registry.INSTANCE.getEPackage(MetadataPackage.eNS_URI);
-
-		// Obtain or create and register package
-		MetadataPackageImpl theMetadataPackage = (MetadataPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof MetadataPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new MetadataPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theMetadataPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theMetadataPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theMetadataPackage.freeze();
-
-		return theMetadataPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTrait() {
-		return traitEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTrait_Value() {
-		return (EReference)traitEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTrait_SourceModelProvider() {
-		return (EAttribute)traitEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIncludeEntityGroup() {
-		return includeEntityGroupEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIncludeEntityGroup_Id() {
-		return (EAttribute)includeEntityGroupEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIncludeEntityGroup_ModelUri() {
-		return (EAttribute)includeEntityGroupEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTrait_Id() {
-		return (EAttribute)traitEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getModel() {
-		return modelEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getModel_SourceModelProvider() {
-		return (EAttribute)modelEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getModel_CurrentModelContext() {
-		return (EAttribute)modelEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getModel_EntityGroups() {
-		return (EReference)modelEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEntity() {
-		return entityEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_ChildEntities() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_Traits() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEntity_Id() {
-		return (EAttribute)entityEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEntity_Type() {
-		return (EAttribute)entityEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_IncludeGroups() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEntityGroup() {
-		return entityGroupEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getITraitVisitor() {
-		return iTraitVisitorEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getIEntityVisitor() {
-		return iEntityVisitorEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getIMetaDataSourceModelProvider() {
-		return iMetaDataSourceModelProviderEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getModelContext() {
-		return modelContextEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataFactory getMetadataFactory() {
-		return (MetadataFactory)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
-		modelEClass = createEClass(MODEL);
-		createEReference(modelEClass, MODEL__ENTITY_GROUPS);
-		createEAttribute(modelEClass, MODEL__SOURCE_MODEL_PROVIDER);
-		createEAttribute(modelEClass, MODEL__CURRENT_MODEL_CONTEXT);
-
-		entityGroupEClass = createEClass(ENTITY_GROUP);
-
-		entityEClass = createEClass(ENTITY);
-		createEReference(entityEClass, ENTITY__CHILD_ENTITIES);
-		createEReference(entityEClass, ENTITY__TRAITS);
-		createEAttribute(entityEClass, ENTITY__ID);
-		createEAttribute(entityEClass, ENTITY__TYPE);
-		createEReference(entityEClass, ENTITY__INCLUDE_GROUPS);
-
-		traitEClass = createEClass(TRAIT);
-		createEAttribute(traitEClass, TRAIT__ID);
-		createEReference(traitEClass, TRAIT__VALUE);
-		createEAttribute(traitEClass, TRAIT__SOURCE_MODEL_PROVIDER);
-
-		includeEntityGroupEClass = createEClass(INCLUDE_ENTITY_GROUP);
-		createEAttribute(includeEntityGroupEClass, INCLUDE_ENTITY_GROUP__ID);
-		createEAttribute(includeEntityGroupEClass, INCLUDE_ENTITY_GROUP__MODEL_URI);
-
-		// Create data types
-		iTraitVisitorEDataType = createEDataType(ITRAIT_VISITOR);
-		iEntityVisitorEDataType = createEDataType(IENTITY_VISITOR);
-		iMetaDataSourceModelProviderEDataType = createEDataType(IMETA_DATA_SOURCE_MODEL_PROVIDER);
-		modelContextEDataType = createEDataType(MODEL_CONTEXT);
-	}
-
-	/**
-	 * <!-- 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
-		modelEClass.getESuperTypes().add(this.getEntity());
-		entityGroupEClass.getESuperTypes().add(this.getEntity());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(modelEClass, Model.class, "Model", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getModel_EntityGroups(), this.getEntityGroup(), null, "entityGroups", null, 0, -1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getModel_SourceModelProvider(), this.getIMetaDataSourceModelProvider(), "sourceModelProvider", null, 0, 1, Model.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getModel_CurrentModelContext(), this.getModelContext(), "currentModelContext", null, 0, 1, Model.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		EOperation op = addEOperation(modelEClass, this.getEntityGroup(), "findIncludeGroup", 0, 1);
-		addEParameter(op, ecorePackage.getEString(), "groupId", 0, 1);
-
-		op = addEOperation(modelEClass, null, "accept");
-		addEParameter(op, this.getIEntityVisitor(), "visitor", 0, 1);
-
-		initEClass(entityGroupEClass, EntityGroup.class, "EntityGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(entityEClass, Entity.class, "Entity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getEntity_ChildEntities(), this.getEntity(), null, "childEntities", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		getEntity_ChildEntities().getEKeys().add(this.getEntity_Id());
-		getEntity_ChildEntities().getEKeys().add(this.getEntity_Type());
-		initEReference(getEntity_Traits(), this.getTrait(), null, "traits", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		getEntity_Traits().getEKeys().add(this.getTrait_Id());
-		initEAttribute(getEntity_Id(), ecorePackage.getEString(), "id", null, 1, 1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEntity_Type(), ecorePackage.getEString(), "type", null, 0, 1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntity_IncludeGroups(), this.getIncludeEntityGroup(), null, "includeGroups", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(entityEClass, null, "accept");
-		addEParameter(op, this.getIEntityVisitor(), "visitor", 0, 1);
-
-		op = addEOperation(entityEClass, this.getModel(), "getModel", 0, 1);
-
-		initEClass(traitEClass, Trait.class, "Trait", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTrait_Id(), ecorePackage.getEString(), "id", null, 1, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTrait_Value(), ecorePackage.getEObject(), null, "value", null, 1, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTrait_SourceModelProvider(), this.getIMetaDataSourceModelProvider(), "sourceModelProvider", null, 0, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(traitEClass, null, "accept");
-		addEParameter(op, this.getITraitVisitor(), "visitor", 0, 1);
-
-		initEClass(includeEntityGroupEClass, IncludeEntityGroup.class, "IncludeEntityGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getIncludeEntityGroup_Id(), ecorePackage.getEString(), "id", null, 1, 1, IncludeEntityGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIncludeEntityGroup_ModelUri(), ecorePackage.getEString(), "modelUri", null, 0, 1, IncludeEntityGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Initialize data types
-		initEDataType(iTraitVisitorEDataType, ITraitVisitor.class, "ITraitVisitor", !IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(iEntityVisitorEDataType, IEntityVisitor.class, "IEntityVisitor", !IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(iMetaDataSourceModelProviderEDataType, IMetaDataSourceModelProvider.class, "IMetaDataSourceModelProvider", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(modelContextEDataType, ModelKeyDescriptor.class, "ModelContext", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-		// http://www.eclipse.org/emf/2002/GenModel
-		createGenModelAnnotations();
-	}
-
-	/**
-	 * 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
-		  (modelEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "metadatamodel"
-		   });		
-		addAnnotation
-		  (getModel_EntityGroups(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entityGroup"
-		   });		
-		addAnnotation
-		  (entityEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entity"
-		   });		
-		addAnnotation
-		  (getEntity_ChildEntities(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entity"
-		   });		
-		addAnnotation
-		  (getEntity_Traits(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "trait"
-		   });		
-		addAnnotation
-		  (getEntity_IncludeGroups(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "include-entity-group"
-		   });		
-		addAnnotation
-		  (getIncludeEntityGroup_ModelUri(), 
-		   source, 
-		   new String[] {
-			 "name", "uri"
-		   });		
-		addAnnotation
-		  (traitEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "trait"
-		   });			
-		addAnnotation
-		  (getTrait_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });
-	}
-
-	/**
-	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/GenModel</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("cast")
-	protected void createGenModelAnnotations() {
-		String source = "http://www.eclipse.org/emf/2002/GenModel";										
-		addAnnotation
-		  ((EOperation)traitEClass.getEOperations().get(0), 
-		   source, 
-		   new String[] {
-			 "body", "visitor.visit(this);"
-		   });	
-	}
-
-} //MetadataPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java
deleted file mode 100644
index 4c5db28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ModelImpl.java,v 1.6 2008/02/01 20:20:47 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Model</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getEntityGroups <em>Entity Groups</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getSourceModelProvider <em>Source Model Provider</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getCurrentModelContext <em>Current Model Context</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-@SuppressWarnings("hiding")
-public class ModelImpl extends EntityImpl implements Model {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getEntityGroups() <em>Entity Groups</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEntityGroups()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList entityGroups = null;
-
-	/**
-	 * The default value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IMetaDataSourceModelProvider SOURCE_MODEL_PROVIDER_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getCurrentModelContext() <em>Current Model Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrentModelContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final ModelKeyDescriptor CURRENT_MODEL_CONTEXT_EDEFAULT = null;
-
-	private IMetaDataSourceModelProvider sourceModelProvider;
-
-	private ModelKeyDescriptor _modelContext;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ModelImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.MODEL;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * May return null.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return sourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider newSourceModelProvider) {
-		sourceModelProvider = newSourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public ModelKeyDescriptor getCurrentModelContext() {
-		return _modelContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setCurrentModelContext(ModelKeyDescriptor newCurrentModelContext) {
-		_modelContext = newCurrentModelContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEntityGroups() {
-		if (entityGroups == null) {
-			entityGroups = new EObjectResolvingEList(EntityGroup.class, this, MetadataPackage.MODEL__ENTITY_GROUPS);
-		}
-		return entityGroups;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				return getEntityGroups();
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				return getSourceModelProvider();
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				return getCurrentModelContext();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				getEntityGroups().clear();
-				getEntityGroups().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider((IMetaDataSourceModelProvider)newValue);
-				return;
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				setCurrentModelContext((ModelKeyDescriptor)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-	
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EntityGroup findIncludeGroup(String groupId){
-		EntityGroup ret = null;
-		for (Iterator it=getEntityGroups().iterator();it.hasNext();){
-			EntityGroup entityGroup = (EntityGroup)it.next();
-			if (entityGroup.getId().equals(groupId)){
-				ret = entityGroup;
-				break;
-			}
-		}
-		return ret;
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				getEntityGroups().clear();
-				return;
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider(SOURCE_MODEL_PROVIDER_EDEFAULT);
-				return;
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				setCurrentModelContext(CURRENT_MODEL_CONTEXT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-
-	public void accept(IEntityVisitor visitor) {
-		if (visitor.stopVisiting())
-			return;
-		visitor.visit(this);
-		
-		if (!getChildEntities().isEmpty()){
-			for (Iterator/*<Entity>*/ it = getChildEntities().iterator(); it.hasNext();){
-				Entity k = (Entity)it.next();
-				k.accept(visitor);
-				if (visitor.stopVisiting())
-					return;
-			}
-		}
-
-		visitor.visitCompleted(this);
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Model getModel() {
-		return this;
-	}
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				return entityGroups != null && !entityGroups.isEmpty();
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				return SOURCE_MODEL_PROVIDER_EDEFAULT == null ? getSourceModelProvider() != null : !SOURCE_MODEL_PROVIDER_EDEFAULT.equals(getSourceModelProvider());
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				return CURRENT_MODEL_CONTEXT_EDEFAULT == null ? getCurrentModelContext() != null : !CURRENT_MODEL_CONTEXT_EDEFAULT.equals(getCurrentModelContext());
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ModelImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java
deleted file mode 100644
index f030f91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitImpl.java,v 1.8 2008/09/03 23:29:04 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.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.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.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Trait</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link TraitImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TraitImpl extends EObjectImpl implements Trait {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * 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 #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EObject value = null;
-
-	/**
-	 * The default value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IMetaDataSourceModelProvider SOURCE_MODEL_PROVIDER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected IMetaDataSourceModelProvider sourceModelProvider = SOURCE_MODEL_PROVIDER_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TraitImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.TRAIT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newValue 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(EObject newValue, NotificationChain msgs) {
-		EObject oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(EObject newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MetadataPackage.TRAIT__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MetadataPackage.TRAIT__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__VALUE, newValue, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return sourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider newSourceModelProvider) {
-		IMetaDataSourceModelProvider oldSourceModelProvider = sourceModelProvider;
-		sourceModelProvider = newSourceModelProvider;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER, oldSourceModelProvider, sourceModelProvider));
-	}
-
-	/**
-	 * <!-- 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, MetadataPackage.TRAIT__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void accept(ITraitVisitor visitor) {
-		visitor.visit(this);
-		visitor.visitCompleted(this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__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 MetadataPackage.TRAIT__ID:
-				return getId();
-			case MetadataPackage.TRAIT__VALUE:
-				return getValue();
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				return getSourceModelProvider();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.TRAIT__VALUE:
-				setValue((EObject)newValue);
-				return;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider((IMetaDataSourceModelProvider)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.TRAIT__VALUE:
-				setValue((EObject)null);
-				return;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider(SOURCE_MODEL_PROVIDER_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.TRAIT__VALUE:
-				return value != null;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				return SOURCE_MODEL_PROVIDER_EDEFAULT == null ? sourceModelProvider != null : !SOURCE_MODEL_PROVIDER_EDEFAULT.equals(sourceModelProvider);
-		}
-		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: ");
-		result.append(id);
-		result.append(", sourceModelProvider: ");
-		result.append(sourceModelProvider);
-		result.append(')');
-		return result.toString();
-	}
-
-	public boolean equals(Object value_){
-		if (!(value_ instanceof String))
-			return super.equals(value_);
-		
-		String key = (String)value_;
-		if (key.equals(getId()))
-			return true;
-		
-		return false;
-	}
-
-    @Override
-    public int hashCode() 
-    {
-        // try to match convention x.equals(y) => x.hashCode() == y.hashCode()
-        return getId() != null ? getId().hashCode() : 0xDEADBEEF;
-    }
-} //TraitImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties
deleted file mode 100644
index 5e9fd47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties
+++ /dev/null
@@ -1,13 +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
-###############################################################################
-
-MissingResource_exception=MissingResourceException for NLSPropertyValue: {0} 
-Key_not_found=(key not found)
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java
deleted file mode 100644
index 81b5e28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataAdapterFactory.java,v 1.4 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.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.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-
-/**
- * <!-- 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.common.metadata.MetadataPackage
- * @generated
- */
-public class MetadataAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MetadataPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = MetadataPackage.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 MetadataSwitch modelSwitch =
-		new MetadataSwitch() {
-			public Object caseModel(Model object) {
-				return createModelAdapter();
-			}
-			public Object caseEntityGroup(EntityGroup object) {
-				return createEntityGroupAdapter();
-			}
-			public Object caseEntity(Entity object) {
-				return createEntityAdapter();
-			}
-			public Object caseTrait(Trait object) {
-				return createTraitAdapter();
-			}
-			public Object caseIncludeEntityGroup(IncludeEntityGroup object) {
-				return createIncludeEntityGroupAdapter();
-			}
-			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.common.metadata.Trait <em>Trait</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.common.metadata.Trait
-	 * @generated
-	 */
-	public Adapter createTraitAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup <em>Include Entity Group</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.common.metadata.IncludeEntityGroup
-	 * @generated
-	 */
-	public Adapter createIncludeEntityGroupAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.Model <em>Model</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.common.metadata.Model
-	 * @generated
-	 */
-	public Adapter createModelAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.Entity <em>Entity</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.common.metadata.Entity
-	 * @generated
-	 */
-	public Adapter createEntityAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.EntityGroup <em>Entity Group</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.common.metadata.EntityGroup
-	 * @generated
-	 */
-	public Adapter createEntityGroupAdapter() {
-		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;
-	}
-
-} //MetadataAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java
deleted file mode 100644
index e365a03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataResourceFactoryImpl.java,v 1.2 2007/01/24 17:22:46 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.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.common.metadata.internal.util.MetadataResourceImpl
- * @generated
- */
-public class MetadataResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Resource createResource(URI uri) {
-		XMLResource result = new MetadataResourceImpl(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;
-	}
-
-} //MetadataResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java
deleted file mode 100644
index aba6948..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataResourceImpl.java,v 1.11 2008/09/11 17:22:00 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLLoad;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler;
-import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-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.IMetaDataSourceModelProvider;
-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.common.metadata.internal.util.MetadataResourceFactoryImpl
- * @generated NOT
- */
-public class MetadataResourceImpl extends XMLResourceImpl implements XMLResource.ResourceHandler {
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Oracle inc.";
-	
-	/**
-	 * IMetaDataSourceModelProvider
-	 */
-	protected IMetaDataSourceModelProvider _provider;
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public MetadataResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	/**
-	 * Constructor
-	 */
-	public MetadataResourceImpl() {
-		super();
-	}
-
-
-	/**
-	 * Constructor
-	 * @param provider
-	 */
-	public MetadataResourceImpl(IMetaDataSourceModelProvider provider){
-		super();
-		_provider = provider;
-	}
-	
-	/**
-	 * @generated NOT
-	 */
-	protected XMLLoad createXMLLoad() {
-		return new MetadataXMLLoad(createXMLHelper());
-	}
-	/**
-	* Override createXMLHelper so that MetadataPackage.eINSTANCE is used for the NoNamespace package
-	* @generated NOT
-	*/
-	protected XMLHelper createXMLHelper() {
-		return new XMLHelperImpl(){
-			@Override
-			public EPackage getNoNamespacePackage() {
-				return MetadataPackage.eINSTANCE;
-			}
-		};
-	}
-	
-	public void postLoad(XMLResource resource, InputStream inputStream,
-            Map options)
-    {
-        final List<EObject>  resContents = resource.getContents();
-        
-        if (resContents.size() > 0)
-        {
-            final Object aRoot = resContents.get(0);
-            if (aRoot instanceof Model)
-            {
-                setModelKeyInTraits((Model) aRoot, (Model) aRoot);
-            }
-        }
-        else
-        {
-            JSFCommonPlugin.log(IStatus.WARNING, 
-               "No model loaded for "+getURI());
-        }
-    }
-
-	private void setModelKeyInTraits(Model root, Entity currentEntity) {
-		// TODO: does this have side effect that we care about? nothing is done with the return value
-	    MetadataPackage.eINSTANCE.getTrait_SourceModelProvider();
-		for (int i=0;i < currentEntity.getTraits().size();i++){
-			((Trait)currentEntity.getTraits().get(i)).setSourceModelProvider(_provider);
-		}
-		for (int j=0;j < currentEntity.getChildEntities().size();j++){
-			setModelKeyInTraits(root,(Entity)currentEntity.getChildEntities().get(j));
-		}
-		
-		if (currentEntity == root){
-			for (int k=0;k < root.getEntityGroups().size();k++){
-				setModelKeyInTraits(root,(Entity)root.getEntityGroups().get(k));
-			}
-		}
-	}
-
-
-	public void postSave(XMLResource resource, OutputStream outputStream,
-			Map options) {
-		// do nothing		
-	}
-
-	public void preLoad(XMLResource resource, InputStream inputStream,
-			Map options) {
-		// do nothing		
-	}
-
-	public void preSave(XMLResource resource, OutputStream outputStream,
-			Map options) {
-		// do nothing		
-	}
-
-	/**
-	 * Override the handleErrors() method so that resource will load gracefully, and errors reported later
-	 * when appropriate
-	 *
-	 * @generated NOT
-	 */
-	private static class MetadataXMLLoad extends XMLLoadImpl {
-
-		public MetadataXMLLoad(XMLHelper helper) {
-			super(helper);
-		}
-
-		@Override
-		protected void handleErrors() throws IOException {
-			//by doing nothing here, this allows the list of non-fatal errors (res.getErrors()) to be returned
-		}
-		
-		@Override
-		protected DefaultHandler makeDefaultHandler() {
-			return new MetadataXMLHandler(resource, helper, options);
-		}
-	}
-	
-	/**
-	 * Ensures that only EMF extension models registered with the EMF Package Registry are considered.
-	 * @generated NOT
-	 */
-	private static class MetadataXMLHandler extends SAXXMLHandler {
-
-		public MetadataXMLHandler(XMLResource xmiResource, XMLHelper helper,
-				Map<?, ?> options) {
-			super(xmiResource, helper, options);
-		}
-
-		@Override
-		protected EPackage getPackageForURI(String uriString) {
-			//code taken from  super and modified so that only package registry is considered
-		    if (uriString == null)
-		    {
-		      return null;
-		    }
-
-		    EPackage ePackage = packageRegistry.getEPackage(uriString);
-
-		    if (ePackage != null && ePackage.eIsProxy())
-		    {
-		      ePackage = null;
-		    }
-
-		    if (ePackage == null)
-		    {
-		      ePackage = handleMissingPackage(uriString);
-		    }
-
-		    if (ePackage == null)
-		    {
-		      error
-		        (new PackageNotFoundException
-		           (uriString,
-		            getLocation(),
-		            getLineNumber(),
-		            getColumnNumber()));
-		    }
-
-		    return ePackage;		  
-		}
-	}
-} //MetadataResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java
deleted file mode 100644
index 4812ac4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataSwitch.java,v 1.6 2007/10/01 04:29:45 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-
-/**
- * <!-- 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.common.metadata.MetadataPackage
- * @generated
- */
-public class MetadataSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MetadataPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataSwitch() {
-		if (modelPackage == null) {
-			modelPackage = MetadataPackage.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 -->
-	 * <!-- end-user-doc -->
-	 * @param theEObject 
-	 * @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 -->
-	 * <!-- end-user-doc -->
-	 * @param theEClass 
-	 * @param theEObject 
-	 * @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 -->
-	 * <!-- end-user-doc -->
-	 * @param classifierID 
-	 * @param theEObject 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case MetadataPackage.MODEL: {
-				Model model = (Model)theEObject;
-				Object result = caseModel(model);
-				if (result == null) result = caseEntity(model);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.ENTITY_GROUP: {
-				EntityGroup entityGroup = (EntityGroup)theEObject;
-				Object result = caseEntityGroup(entityGroup);
-				if (result == null) result = caseEntity(entityGroup);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.ENTITY: {
-				Entity entity = (Entity)theEObject;
-				Object result = caseEntity(entity);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.TRAIT: {
-				Trait trait = (Trait)theEObject;
-				Object result = caseTrait(trait);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.INCLUDE_ENTITY_GROUP: {
-				IncludeEntityGroup includeEntityGroup = (IncludeEntityGroup)theEObject;
-				Object result = caseIncludeEntityGroup(includeEntityGroup);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Trait</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>Trait</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTrait(Trait object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Include Entity Group</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>Include Entity Group</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIncludeEntityGroup(IncludeEntityGroup object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Model</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>Model</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseModel(Model object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Entity</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>Entity</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEntity(Entity object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Entity Group</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>Entity Group</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEntityGroup(EntityGroup 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;
-	}
-
-} //MetadataSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java
deleted file mode 100644
index 39a9791..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataXMLProcessor.java,v 1.3 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataXMLProcessor extends XMLProcessor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		MetadataPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the MetadataResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Map getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new MetadataResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new MetadataResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //MetadataXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java
deleted file mode 100644
index 836883f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * EMF interface objects for design-time metadata.   
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.metadata;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.java
deleted file mode 100644
index 282b639..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract class implmenting {@link IEntityQueryVisitor} that concrete subclasses should provide implementations
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractEntityQueryVisitor extends AbstractEntityVisitor
-		implements IEntityQueryVisitor {
-
-	/** 
-	 * @return EmptyResultSet.   Subclasses should override.
-	 */
-	public IResultSet findEntities(Entity initialEntityContext, String entityKey) {
-		return new EmptyResultSet();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java
deleted file mode 100644
index 54e6f01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java
+++ /dev/null
@@ -1,30 +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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract implementation that concrete subclasses should ovveride
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractEntityVisitor extends AbstractMetaDataVisitor
-		implements IEntityVisitor {
-
-	public abstract void visit(Entity entity);
-
-	public void visitCompleted(Entity entity){
-		//subclasses should override if needed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java
deleted file mode 100644
index 15443e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java
+++ /dev/null
@@ -1,28 +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.common.metadata.query;
-
-/**
- * Abstract class implementing {@link IMetaDataVisitor}
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractMetaDataVisitor implements IMetaDataVisitor {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {		
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.java
deleted file mode 100644
index 32b4982..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.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:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Abstract implementation of {@link IResultSet} that developers may subclass.
- * Users should assume that the results are only valid at the time of the query.  This may change in the future.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractResultSet/*<T>*/ implements IResultSet/*<T>*/ {
-	private List		_results;
-	private boolean 	_isClosed = false;
-	
-	public List getResults() throws MetaDataException {
-		initIfNecessary();
-		return _results;
-	}
-	
-	public final void close() throws MetaDataException {
-		doClose();
-		_isClosed = true;
-		_results = null;
-	}
-
-	/**
-	 * Overridable method to close resultset.  This is called by close()
-	 * @throws MetaDataException
-	 */
-	protected void doClose() throws MetaDataException {
-		//subclasses to provide override
-	}
-	
-	public final boolean isClosed() {		
-		return _isClosed;
-	}
-
-	/**
-	 * @return List of results.  Null is tolerated.
-	 */
-	protected abstract List getInternalResults();
-	
-	private void initIfNecessary() throws MetaDataException {
-		if (_isClosed)
-			throw new MetaDataException("Attempt to access a closed resultset.");
-		
-		if (_results == null) {
-			List checkNullResults = getInternalResults();
-			if (checkNullResults == null){
-				checkNullResults = Collections.EMPTY_LIST;
-			} 
-			_results = Collections.unmodifiableList(checkNullResults);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.java
deleted file mode 100644
index ddb8940..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract implmentation of {@link ITraitQueryVisitor} that subclasses should use to provide implmentation
- * <p><b>Provisional API - subject to change</b></p> 
- */
-public abstract class AbstractTraitQueryVisitor extends AbstractTraitVisitor implements
-		ITraitQueryVisitor {
-
-	/** 
-	 * @return EmptyResultSet.   Subclasses should override.
-	 */
-	public IResultSet findTraits(Entity entity, String traitKey) {
-		return new EmptyResultSet();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java
deleted file mode 100644
index 795a473..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java
+++ /dev/null
@@ -1,29 +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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Abstract Trait visitor
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractTraitVisitor extends AbstractMetaDataVisitor implements ITraitVisitor{
-
-	public abstract void visit(final Trait trait); 
-	
-	public void visitCompleted(final Trait trait) {
-		//subclasses should override if needed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java
deleted file mode 100644
index 0c6539e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java
+++ /dev/null
@@ -1,39 +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.common.metadata.query;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Implementation of an empty result set
- * <p><b>Provisional API - subject to change</b></p>
- */
-public final class EmptyResultSet implements IResultSet {
-	private boolean _isClosed = false;
-	public void close() {
-		_isClosed = true;
-	}
-	
-	public List getResults() throws MetaDataException{
-		if (_isClosed)
-			throw new MetaDataException("Resultset is closed");
-		
-		return Collections.EMPTY_LIST;		
-	}
-
-	public boolean isClosed() {
-		return _isClosed;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java
deleted file mode 100644
index 7f168c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java
+++ /dev/null
@@ -1,30 +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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Entity querying interface
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractEntityQueryVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IEntityQueryVisitor extends IEntityVisitor{
-	/**
-	 * @param initialEntityContext
-	 * @param entityKey to find relative to the passed intialEntityContext
-	 * @return IResultSet of Entities matching the key.  IResultSet must NOT be null.  Implementers may return {@link EmptyResultSet}.
-	 */
-	public IResultSet/*<Entity>*/ findEntities(final Entity initialEntityContext,
-			final String entityKey);
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.java
deleted file mode 100644
index fcc1783..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Visitor interface for Entities
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractEntityVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IEntityVisitor extends IMetaDataVisitor {
-	/**
-	 * Visit the entity. 
-	 * The entity and then it's children are visited
-	 * @param entity - must not be NULL
-	 */
-	public void visit(final Entity entity);
-	/**
-	 * Signal that the entity and all it's children is now completely 'visited'.  
-	 * The entity will call this method at the end of the accept method.
-	 * @param entity - must not be NULL
-	 */
-	public void visitCompleted(Entity entity);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java
deleted file mode 100644
index c70cdd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java
+++ /dev/null
@@ -1,25 +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.common.metadata.query;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IMetaDataModelContext extends IModelContext {
-	/**
-	 * @return domain identifier for this context.  
-	 * <p>This must match the domain id from the org.eclipse.jst.jsf.common.DomainLoadingStrategies
-	 */
-	public String getDomainID();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java
deleted file mode 100644
index 35a3652..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java
+++ /dev/null
@@ -1,24 +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.common.metadata.query;
-
-/**
- * Common interface for Entity and Trait visitors
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractMetaDataVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IMetaDataVisitor {
-	/**
-	 * @return true if visitor has recognized that visiting should stop
-	 */
-	public boolean stopVisiting();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java
deleted file mode 100644
index 0d0ab48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java
+++ /dev/null
@@ -1,44 +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.common.metadata.query;
-
-import java.util.List;
-
-
-
-/**
- * Results from a metadata query.  The resultset should be considered valid only at the time that the query is performed.
- * Once "closed", the resultset should not be accessed again. 
- * 
- * <p>Not intended to be implemented directly by clients.  Developers should extend {@link AbstractResultSet} instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IResultSet/*<T>*/{
-	
-	/**
-	 * @return unmodifiable List of results.  May NOT be null.  Implementer must return Collections.EMPTY_LIST instead.
-	 * @throws MetaDataException 
-	 */
-	public List/*<T>*/ getResults() throws MetaDataException;
-
-	/**
-	 * Signal that the query results are no longer required allowing for any cleanup that may be required
-	 * Once a resultset is closed, a MetaDataException should be thrown if the next() or hasNext() is called.  Clients can check isClosed() first.
-	 * @throws MetaDataException 
-	 */
-	public void close() throws MetaDataException;
-	
-	/**
-	 * @return true if this resultset has been closed. 
-	 */
-	public boolean isClosed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java
deleted file mode 100644
index 17595f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java
+++ /dev/null
@@ -1,30 +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.common.metadata.query;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Context for determining the Model to locate in the MetaDataManager
- * <p>Should NOT be implemented by clients
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITaglibDomainMetaDataModelContext extends IMetaDataModelContext {
-	/**
-	 * @return project 
-	 */
-	public IProject getProject();
-	/**
-	 * @return the namespace URI as String
-	 */
-	public String getURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java
deleted file mode 100644
index fd96a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java
+++ /dev/null
@@ -1,30 +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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Trait querying interface
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractTraitQueryVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITraitQueryVisitor extends ITraitVisitor{
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @return IResultSet of Traits.  IResultSet must NOT be null.  Implementers may return {@link EmptyResultSet}.
-	 */
-	public IResultSet/*<Trait>*/ findTraits(final Entity entity,
-			final String traitKey);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.java
deleted file mode 100644
index 9b39a10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.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.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Visitor interface for Traits
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractTraitVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITraitVisitor extends IMetaDataVisitor {
-	/**
-	 * Visit the Trait.
-	 * Implementer cannot assume ordering of trait visiting. 
-	 * @param trait - must not be null
- 	 */
-	public void visit(final Trait trait);
-	
-	/**
-	 * Signal that the the trait has been completely visited
-	 * @param trait
-	 */
-	public void visitCompleted(final Trait trait);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.java
deleted file mode 100644
index 50b314f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.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.common.metadata.query;
-
-/**
- * Exception intended to be superclass of all exceptions thrown while handling metadata during query
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class MetaDataException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	/**
-	 * Constructor
-	 */
-	public MetaDataException(){
-		super();
-	}
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public MetaDataException(String msg){
-		super(msg);
-	}
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param cause 
-	 */
-	public MetaDataException(String msg, Throwable cause){
-		super(msg, cause);
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java
deleted file mode 100644
index b8afde9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java
+++ /dev/null
@@ -1,223 +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.common.metadata.query;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-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.MetaDataModel;
-import org.eclipse.jst.jsf.common.metadata.internal.TaglibDomainMetaDataModelContextImpl;
-import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelManager;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
-
-
-/**
- * Helper class with static methods to simplify querying of a metadata model. 
- * 
- * <p>Steps for use:
- * 	<br>1) Get the ITaglibDomainMetaDataModelContext using createMetaDataModelContext or createTagLibraryDomainMetaDataModelContext
- * 	<br>2) Use appropriate getXXX methods using the ITaglibDomainMetaDataModelContext.
- * <p><b>Provisional API - subject to change</b></p>
- * @see IResultSet
- * @see IEntityQueryVisitor
- * @see ITraitQueryVisitor
- * @see ITaglibDomainMetaDataModelContext
- * @see Model
- * @see Entity
- * @see Trait
- */
-public final class TaglibDomainMetaDataQueryHelper{
-	/**
-	 * Domain id for Tag library domain of metatdata  
-	 */
-	public static final String TAGLIB_DOMAIN = "TagLibraryDomain"; //need better place for this
-	
-	/**
-	 * private constructor
-	 */
-	private TaglibDomainMetaDataQueryHelper (){
-		super();
-	}
-	
-	/**
-	 * Convenience method for creating {@link ITaglibDomainMetaDataModelContext}s for TAGLIB_DOMAIN
-	 * @param project
-	 * @param uri
-	 * @return ITaglibDomainMetaDataModelContext
-	 */
-	public static ITaglibDomainMetaDataModelContext createMetaDataModelContext(IProject project, String uri){
-		return new TaglibDomainMetaDataModelContextImpl(TAGLIB_DOMAIN, project, uri);
-	}
-	/**
-	 * @param modelContext
-	 * @return Model object for given context.   May return null if not located.
-	 */
-	public static Model getModel(final ITaglibDomainMetaDataModelContext modelContext) {
-		MetaDataModel model = getMDModel(modelContext);
-		//we may want to throw error that model is empty
-		if (model != null && !model.isEmpty()){			
-			return (Model)model.getRoot();
-		}
-		return null;
-	}
-
-	/**
-	 * @param modelContext
-	 * @param entityKey relative to root of the model
-	 * @return the first entity match from the root of the model.   May return null.
-	 */
-	public static Entity getEntity(final ITaglibDomainMetaDataModelContext modelContext,
-			final String entityKey) {
-		IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		IResultSet/*<Entity>*/ rs = getEntities(modelContext,entityKey,  visitor);
-		Entity e = null;
-		try {
-			if (! rs.getResults().isEmpty()){
-				e = (Entity)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 1", ex);
-		}
-
-		return e;
-	}
-
-	/**
-	 * @param modelContext 
-	 * @param entityKey relative to root of model 
-	 * @param visitor 
-	 * @return an IResultSet of entity objects
-	 */
-	public static IResultSet/*<Entity>*/ getEntities(final ITaglibDomainMetaDataModelContext modelContext,
-				final String entityKey, final IEntityQueryVisitor visitor){
-		Model model = getModel(modelContext);
-		//we may want to throw error that model is empty
-		return getEntities(model, entityKey, visitor);
-		
-	}
-
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @return a trait or null for the given entity and traitKey using a SimpleEntityQueryVisitorImpl 
-	 */
-	public static Trait getTrait(final Entity entity, final String traitKey){
-		ITraitQueryVisitor visitor = new SimpleTraitQueryVisitorImpl();	
-		Trait t= null;
-		IResultSet/*<Trait>*/ rs = getTraits(entity, traitKey, visitor);
-		try {
-			if (! rs.getResults().isEmpty()){
-				t = (Trait)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getTrait()", ex);
-		}
-
-		return t;
-	}
-
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @param traitQueryVisitor
-	 * @return an IResultSet of trait objects using supplied traitQueryVisitor.  IResultSet should NOT be null.
-	 */
-	public static IResultSet/*<Trait>*/ getTraits(Entity entity, String traitKey,
-			ITraitQueryVisitor traitQueryVisitor) { 
-		IResultSet/*<Trait>*/ rs = traitQueryVisitor.findTraits(entity, traitKey);
-		return rs;
-	}
-
-	/**
-	 * @param initialEntityContext
-	 * @param entityKey relative to initial passed entity
-	 * @return the first entity located by key using SimpleEntityQueryVisitorImpl
-	 */
-	public static Entity getEntity(Entity initialEntityContext, String entityKey) {
-		IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		Entity e= null;
-		IResultSet/*<Entity>*/ rs = getEntities(initialEntityContext, entityKey, visitor);
-		try {
-			if (! rs.getResults().isEmpty()){
-				e = (Entity)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 0", ex);
-		}		
-
-		return e;		
-	}
-
-	/**
-	 * @param initialEntityContext
-	 * @param entityQuery relative to initial passed entity
-	 * @param entityKeyQueryVisitor
-	 * @return IResultSet of entities located by key using entityQueryVisitor.  IResultSet should NOT be null.
-	 */
-	public static IResultSet/*<Entity>*/ getEntities(Entity initialEntityContext, String entityQuery,
-			IEntityQueryVisitor entityKeyQueryVisitor) {
-				
-		return entityKeyQueryVisitor.findEntities(initialEntityContext, entityQuery);	
-	}
-
-	
-	/**
-	 * Retrieve the MetaDataModel from the ModelManager for given key
-	 * @param modelContext
-	 * @return MetaDataModel
-	 */
-	private static MetaDataModel getMDModel(final ITaglibDomainMetaDataModelContext modelContext){
-		MetaDataModelManager mgr = null;
-		if (modelContext.getProject() != null)
-			mgr = MetaDataModelManager.getInstance(modelContext.getProject());
-		else //temp(?)
-			mgr = MetaDataModelManager.getSharedInstance();	
-
-		return mgr.getModel(modelContext);
-	}
-
-	/**
-	 * @param modelContext
-	 * @param entityKey
-	 * @param traitKey
-	 * @return first trait found for entity and trait key starting from root of the model using SimpleMetaDataQueryImpl
-	 */
-	public static Trait getTrait(final ITaglibDomainMetaDataModelContext modelContext,
-			final String entityKey, final String traitKey) { 
-		Entity entity = getEntity(modelContext, entityKey);
-		Trait t = null;
-		if (entity != null){			
-			t = getTrait(entity, traitKey);
-		}
-		return t;
-	}	
-	
-	/**
-	 * @param tagEntity
-	 * @return QName for tag entity
-	 */
-	public static QName getQNameForTagEntity(Entity tagEntity) {
-		Assert.isTrue(tagEntity != null);
-		return new QName(tagEntity.getModel().getCurrentModelContext().getUri(), tagEntity.getId());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java
deleted file mode 100644
index 36d446e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java
+++ /dev/null
@@ -1,65 +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.common.metadata.query.internal;
-
-/**
- * Sets controls on how a tree of nodes can be searched
- */
-public class HierarchicalSearchControl extends SearchControl {
-	//scope levels
-	/**
-	 * Do not recurse.  
-	 */
-	public static final int SCOPE_CURRENT_LEVEL = 0;
-	/**
-	 * Allow for one level of children to be visited from initial context
-	 */
-	public static final int SCOPE_ONE_LEVEL = 1;
-	/**
-	 * Allow unlimited recursion of children
-	 */
-	public static final int SCOPE_ALL_LEVELS = 2;
-	
-	private int scope = SCOPE_ALL_LEVELS;
-	
-	/**
-	 * Constructor using defaults of COUNT_LIMIT_NONE and SCOPE_ALL_LEVELS 
-	 */
-	public HierarchicalSearchControl(){
-		super();
-	}
-	/**
-	 * Constructor
-	 * @param countLimit
-	 * @param scope
-	 */
-	public HierarchicalSearchControl(int countLimit, int scope){
-		super(countLimit);
-		this.scope = scope;
-	}
-	
-	
-	/**
-	 * @param scope
-	 */
-	public void setScope(int scope){
-		this.scope= scope;
-	}
-	
-	/**
-	 * @return scope
-	 */
-	public int getScope(){
-		return scope;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.java
deleted file mode 100644
index 43e1317..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.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.common.metadata.query.internal;
-
-/**
- * Simple class used by {@link SimpleEntityQueryVisitorImpl} allowing some control of a metadata query.  
- * A query visitor can use this to optimize the query results and signal completion.
- */
-public class SearchControl {	
-
-	/**
-	 * No limit on query results
-	 */
-	public static final int COUNT_LIMIT_NONE = -1;
-	
-	//default settings
-	private int countLimit = COUNT_LIMIT_NONE;
-
-	
-	/**
-	 * Constructor using defaults of COUNT_LIMIT_NONE
-	 */
-	public SearchControl(){
-		//use default settings
-	}
-	
-	/**
-	 * Constructor
-	 * @param countLimit
-	 */
-	public SearchControl(int countLimit){
-		this.countLimit = countLimit;
-	}
-	
-	/**
-	 * @param limit results count limit
-	 */
-	public void setCountLimit(int limit){
-		this.countLimit = limit;
-	}
-	
-	/**
-	 * @return query results count limit
-	 */
-	public int getCountLimit(){
-		return countLimit;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java
deleted file mode 100644
index 0748095..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java
+++ /dev/null
@@ -1,182 +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.common.metadata.query.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.query.AbstractEntityQueryVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
-
-
-/**
- * A simple metadata query visitor implementing {@link org.eclipse.jst.jsf.common.metadata.query.IEntityQueryVisitor} and {@link org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor}.
- * - simple find entity and traits by id only 	
- * - Does not allow for wild card searchs
- * 
- * 	TODO - fix for case-sensitivity   https://bugs.eclipse.org/bugs/show_bug.cgi?id=212794
- */
-public class SimpleEntityQueryVisitorImpl extends AbstractEntityQueryVisitor  {
-	private HierarchicalSearchControl control;
-	private boolean _stop;
-
-	private EntityQueryComparator entityComparator;
-	private List/*<Entity>*/ _entityResults;
-
-	/**
-	 * Constructor that also creates a default SearchControl
-	 */
-	public SimpleEntityQueryVisitorImpl() {
-		super();
-		control = new HierarchicalSearchControl();
-	}
-	
-	/**
-	 * Constructor
-	 * @param control
-	 */
-	public SimpleEntityQueryVisitorImpl(HierarchicalSearchControl control) {
-		super();
-		this.control = control;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityQueryVisitor#findEntities(org.eclipse.jst.jsf.common.metadata.Entity, java.lang.String)
-	 */
-	public IResultSet/*<Entity>*/ findEntities(Entity initialEntityContext,
-			String entityKey) {
-		
-		resetQuery();
-		
-		if (initialEntityContext != null){
-			entityComparator = new EntityQueryComparator(entityKey);			
-			initialEntityContext.accept(this);			
-		}
-		
-		return new SimpleResultSet(getInternalEntityResults());
-	}
-
-	private void resetQuery() {
-		_stop = false;
-		_entityResults = null;
-	}
-
-	private List/*<Entity>*/ getInternalEntityResults(){
-		if (_entityResults == null){
-			_entityResults = new ArrayList/*<Entity>*/();
-		}
-		return _entityResults;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visit(org.eclipse.jst.jsf.common.metadata.Entity)
-	 */
-	public void visit(Entity key) {		
-		switch (entityComparator.compareTo(key)){
-			case 0:
-				getInternalEntityResults().add(key);
-				break;
-			default:
-				break;
-
-		}
-		checkShouldStopVisitingEntities();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visitCompleted(Entity entity)
-	 */
-	public void visitCompleted(Entity entity) {
-		entityComparator.popContext();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {
-		return _stop;
-	}
-
-	private void checkShouldStopVisitingEntities(){
-		//implement how to set stop to signal to the entity accept() to skip visiting
-		if (control.getCountLimit()== getInternalEntityResults().size() && control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE )
-			_stop = true;
-	}
-
-	/**
-	 * Simple comparator that compares that an entity's id for with another.
-	 * Case-insensitive compare
-	 *
-	 */
-	private class EntityQueryComparator implements Comparable/*<Entity>*/{
-
-		private String entityKey;
-		private EntityStack stack;
-
-		/**
-		 * Constructor
-		 * @param entityKey
-		 */
-		public EntityQueryComparator(String entityKey){
-			this.entityKey = entityKey.toUpperCase();		
-			stack = new EntityStack();
-		}
-		
-		public int compareTo(Object entity) {			
-			stack.push(entity);
-			return entityKey.compareTo(getRelativeId().toUpperCase());			
-		}
-		
-		/**
-		 * Pop stack
-		 */
-		public void popContext(){
-			stack.pop();
-		}
-		
-		private String getRelativeId(){
-			int size = stack.size();
-			int i = 1;
-			StringBuffer buf = new StringBuffer();
-			while(i < size){
-				Entity e = (Entity)stack.elementAt(i);
-				if (!(e instanceof EntityGroup)){
-					if (buf.length()>0) 
-						buf.append("/");
-					buf.append(e.getId());
-				}
-				i++;
-			}
-			return buf.toString();
-		}
-	}
-	
-	/**
-	 * Stack used for determining relative key of an entity from the initial context.
-	 */
-	private class EntityStack extends Stack/*<Entity>*/ {
-		/**
-         * 
-         */
-        private static final long serialVersionUID = -6010267544968175003L;
-
-        /**
-         * Constructor
-         */
-        public EntityStack(){
-			super();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.java
deleted file mode 100644
index a3b2f2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.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:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.query.AbstractResultSet;
-
-/**
- * Simple implementation of {@link org.eclipse.jst.jsf.common.metadata.query.IResultSet} by extending AbstractResultSet
- *
- */
-public final class SimpleResultSet/*<T>*/ extends AbstractResultSet/*<T>*/ {	
-	private List/*<T>*/ results;	
-	
-	/**
-	 * Constructor passing a list to hold the results
-	 * @param results 
-	 */
-	public SimpleResultSet(List/*<T>*/ results){
-		super();
-		this.results = results;
-	}
-
-	protected List getInternalResults(){
-		if (results == null){
-			results = Collections.EMPTY_LIST;
-		}
-		return results;
-	}
-	
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java
deleted file mode 100644
index 0042364..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java
+++ /dev/null
@@ -1,111 +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.common.metadata.query.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.AbstractTraitQueryVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
-
-
-/**
- * A simple metadata query visitor implementing {@link org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor}.
- * - simple find traits by id only 	
- * - Does not allow for wild card searchs
- */
-public class SimpleTraitQueryVisitorImpl extends AbstractTraitQueryVisitor  {
-
-	private String _traitQuery;
-	private SearchControl _control;
-	private boolean _stop;
-	private List/*<Trait>*/ _traitResults;
-
-	/**
-	 * Constructor that also creates a default SearchControl
-	 */
-	public SimpleTraitQueryVisitorImpl() {
-		super();
-		_control = new SearchControl();
-	}
-	
-	/**
-	 * Constructor
-	 * @param control
-	 */
-	public SimpleTraitQueryVisitorImpl(SearchControl control) {
-		super();
-		this._control = control;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor#findTraits(org.eclipse.jst.jsf.common.metadata.Entity, java.lang.String)
-	 */
-	public IResultSet/*<Trait>*/ findTraits(final Entity entity, final String traitQuery){
-		
-		resetQuery();
-		if (entity != null){			
-			this._traitQuery = traitQuery;			
-			for (Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-				Trait t = (Trait)it.next();
-				t.accept(this);
-				if (stopVisiting())
-					break;
-			}
-		}
-		return new SimpleResultSet(getInternalTraitResults());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor#visit(org.eclipse.jst.jsf.common.metadata.Trait)
-	 */
-	public void visit(Trait trait) {		
-		if (trait.equals(_traitQuery))
-			getInternalTraitResults().add(trait);		
-		
-		checkShouldStopVisitingTraits();
-	}
-
-	/**
-	 * 
-	 */
-	private void resetQuery() {
-		_stop = false;
-		_traitResults = null;
-	}
-
-	/**
-	 * @return lazy init of a SimpleResultSet of Traits
-	 */
-	private List/*<Trait>*/ getInternalTraitResults(){
-		if (_traitResults == null){
-			_traitResults = new ArrayList/*<Trait>*/();
-		}
-		return _traitResults;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {
-		return _stop;
-	}
-
-	private void checkShouldStopVisitingTraits(){
-		if (_control.getCountLimit()== getInternalTraitResults().size() && _control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE)
-			_stop = true;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/package-info.java
deleted file mode 100644
index bb9019e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/package-info.java
+++ /dev/null
@@ -1,17 +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 query interface.   
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.metadata.query;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java
deleted file mode 100644
index 52b3382..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-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 Of Values</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.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries <em>Entries</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getListOfValues()
- * @model
- * @generated
- */
-public interface ListOfValues extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Entries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.xml.type.SimpleAnyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Entries</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>Entries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getListOfValues_Entries()
-	 * @model type="org.eclipse.emf.ecore.xml.type.SimpleAnyType" containment="true"
-	 *        extendedMetaData="kind='element' name='item'"
-	 * @generated
-	 */
-	EList getEntries();
-
-} // ListOfValues
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java
deleted file mode 100644
index 9c4fea7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Set Generator</b></em>'.
- *
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator()
- * @model
- * @generated
- */
-public interface SetGenerator extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Returns the value of the '<em><b>Algorithm</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Algorithm</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Algorithm</em>' attribute.
-     * @see #setAlgorithm(String)
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator_Algorithm()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getAlgorithm();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Algorithm</em>' attribute.
-     * @see #getAlgorithm()
-     * @generated
-     */
-    void setAlgorithm(String value);
-
-    /**
-     * Returns the value of the '<em><b>Expression</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Expression</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Expression</em>' attribute.
-     * @see #setExpression(String)
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator_Expression()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getExpression();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Expression</em>' attribute.
-     * @see #getExpression()
-     * @generated
-     */
-    void setExpression(String value);
-
-} // SetGenerator
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java
deleted file mode 100644
index 6e76eed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-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.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public interface TraitTypesFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	TraitTypesFactory eINSTANCE = org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>List Of Values</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>List Of Values</em>'.
-	 * @generated
-	 */
-	ListOfValues createListOfValues();
-
-	/**
-     * Returns a new object of class '<em>Set Generator</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Set Generator</em>'.
-     * @generated
-     */
-    SetGenerator createSetGenerator();
-
-    /**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	TraitTypesPackage getTraitTypesPackage();
-
-} //TraitTypesFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java
deleted file mode 100644
index 5ea095d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-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.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface TraitTypesPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "traittypes";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "mdt";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	TraitTypesPackage eINSTANCE = org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl <em>List Of Values</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getListOfValues()
-	 * @generated
-	 */
-	int LIST_OF_VALUES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Entries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_OF_VALUES__ENTRIES = 0;
-
-	/**
-	 * The number of structural features of the '<em>List Of Values</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_OF_VALUES_FEATURE_COUNT = 1;
-
-
-	/**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl <em>Set Generator</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getSetGenerator()
-     * @generated
-     */
-    int SET_GENERATOR = 1;
-
-    /**
-     * The feature id for the '<em><b>Algorithm</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR__ALGORITHM = 0;
-
-    /**
-     * The feature id for the '<em><b>Expression</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR__EXPRESSION = 1;
-
-    /**
-     * The number of structural features of the '<em>Set Generator</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR_FEATURE_COUNT = 0;
-
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues <em>List Of Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>List Of Values</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues
-	 * @generated
-	 */
-	EClass getListOfValues();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries <em>Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Entries</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries()
-	 * @see #getListOfValues()
-	 * @generated
-	 */
-	EReference getListOfValues_Entries();
-
-	/**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator <em>Set Generator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Set Generator</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator
-     * @generated
-     */
-    EClass getSetGenerator();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm <em>Algorithm</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Algorithm</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm()
-     * @see #getSetGenerator()
-     * @generated
-     */
-    EAttribute getSetGenerator_Algorithm();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression <em>Expression</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Expression</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression()
-     * @see #getSetGenerator()
-     * @generated
-     */
-    EAttribute getSetGenerator_Expression();
-
-    /**
-	 * 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
-	 */
-	TraitTypesFactory getTraitTypesFactory();
-
-	/**
-	 * <!-- 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.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl <em>List Of Values</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getListOfValues()
-		 * @generated
-		 */
-		EClass LIST_OF_VALUES = eINSTANCE.getListOfValues();
-
-		/**
-		 * The meta object literal for the '<em><b>Entries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference LIST_OF_VALUES__ENTRIES = eINSTANCE.getListOfValues_Entries();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl <em>Set Generator</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl
-         * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getSetGenerator()
-         * @generated
-         */
-		EClass SET_GENERATOR = eINSTANCE.getSetGenerator();
-
-        /**
-         * The meta object literal for the '<em><b>Algorithm</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-		EAttribute SET_GENERATOR__ALGORITHM = eINSTANCE.getSetGenerator_Algorithm();
-
-        /**
-         * The meta object literal for the '<em><b>Expression</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-		EAttribute SET_GENERATOR__EXPRESSION = eINSTANCE.getSetGenerator_Expression();
-
-	}
-
-} //TraitTypesPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java
deleted file mode 100644
index c3ce0ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ListOfValuesImpl.java,v 1.3 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.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.emf.ecore.xml.type.SimpleAnyType;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>List Of Values</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl#getEntries <em>Entries</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ListOfValuesImpl extends EObjectImpl implements ListOfValues {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached value of the '{@link #getEntries() <em>Entries</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getEntries()
-     * @generated
-     * @ordered
-     */
-    protected EList entries = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ListOfValuesImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return TraitTypesPackage.Literals.LIST_OF_VALUES;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getEntries() {
-        if (entries == null) {
-            entries = new EObjectContainmentEList(SimpleAnyType.class, this, TraitTypesPackage.LIST_OF_VALUES__ENTRIES);
-        }
-        return entries;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return ((InternalEList)getEntries()).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 TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return getEntries();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                getEntries().clear();
-                getEntries().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                getEntries().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return entries != null && !entries.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //ListOfValuesImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java
deleted file mode 100644
index e4d96b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SetGeneratorImpl.java,v 1.2 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.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.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Set Generator</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl#getAlgorithm <em>Algorithm</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl#getExpression <em>Expression</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SetGeneratorImpl extends EObjectImpl implements SetGenerator {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The default value of the '{@link #getAlgorithm() <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAlgorithm()
-     * @generated
-     * @ordered
-     */
-    protected static final String ALGORITHM_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getAlgorithm() <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAlgorithm()
-     * @generated
-     * @ordered
-     */
-    protected String algorithm = ALGORITHM_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getExpression()
-     * @generated
-     * @ordered
-     */
-    protected static final String EXPRESSION_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getExpression()
-     * @generated
-     * @ordered
-     */
-    protected String expression = EXPRESSION_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected SetGeneratorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return TraitTypesPackage.Literals.SET_GENERATOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getAlgorithm() {
-        return algorithm;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setAlgorithm(String newAlgorithm) {
-        String oldAlgorithm = algorithm;
-        algorithm = newAlgorithm;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, TraitTypesPackage.SET_GENERATOR__ALGORITHM, oldAlgorithm, algorithm));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getExpression() {
-        return expression;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setExpression(String newExpression) {
-        String oldExpression = expression;
-        expression = newExpression;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, TraitTypesPackage.SET_GENERATOR__EXPRESSION, oldExpression, expression));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                return getAlgorithm();
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                return getExpression();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                setAlgorithm((String)newValue);
-                return;
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                setExpression((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                setAlgorithm(ALGORITHM_EDEFAULT);
-                return;
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                setExpression(EXPRESSION_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                return ALGORITHM_EDEFAULT == null ? algorithm != null : !ALGORITHM_EDEFAULT.equals(algorithm);
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                return EXPRESSION_EDEFAULT == null ? expression != null : !EXPRESSION_EDEFAULT.equals(expression);
-        }
-        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(" (algorithm: ");
-        result.append(algorithm);
-        result.append(", expression: ");
-        result.append(expression);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SetGeneratorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java
deleted file mode 100644
index 6aa6dfc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesFactoryImpl.java,v 1.5 2007/05/11 17:54:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.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.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesFactoryImpl extends EFactoryImpl implements TraitTypesFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesFactory
-     * @generated
-     */
-    public static TraitTypesFactory init() {
-        try {
-            TraitTypesFactory theTraitTypesFactory = (TraitTypesFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"); 
-            if (theTraitTypesFactory != null) {
-                return theTraitTypesFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new TraitTypesFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case TraitTypesPackage.LIST_OF_VALUES: return createListOfValues();
-            case TraitTypesPackage.SET_GENERATOR: return createSetGenerator();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ListOfValues createListOfValues() {
-        ListOfValuesImpl listOfValues = new ListOfValuesImpl();
-        return listOfValues;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator createSetGenerator() {
-        SetGeneratorImpl setGenerator = new SetGeneratorImpl();
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesPackage getTraitTypesPackage() {
-        return (TraitTypesPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesPackage
-     * @deprecated
-     * @generated
-     */
-    public static TraitTypesPackage getPackage() {
-        return TraitTypesPackage.eINSTANCE;
-    }
-
-} //TraitTypesFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java
deleted file mode 100644
index e40e5ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesPackageImpl.java,v 1.5 2007/05/11 17:54:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.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.emf.ecore.xml.type.XMLTypePackage;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesPackageImpl extends EPackageImpl implements TraitTypesPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass listOfValuesEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass setGeneratorEClass = 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.common.metadata.traittypes.traittypes.TraitTypesPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private TraitTypesPackageImpl() {
-        super(eNS_URI, TraitTypesFactory.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 -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesPackage
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static TraitTypesPackage init() {
-        if (isInited) return (TraitTypesPackage)EPackage.Registry.INSTANCE.getEPackage(TraitTypesPackage.eNS_URI);
-
-        // Obtain or create and register package
-        TraitTypesPackageImpl theTraitTypesPackage = (TraitTypesPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof TraitTypesPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new TraitTypesPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        XMLTypePackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theTraitTypesPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theTraitTypesPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theTraitTypesPackage.freeze();
-
-        return theTraitTypesPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getListOfValues() {
-        return listOfValuesEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getListOfValues_Entries() {
-        return (EReference)listOfValuesEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getSetGenerator() {
-        return setGeneratorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSetGenerator_Algorithm() {
-        return (EAttribute)setGeneratorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSetGenerator_Expression() {
-        return (EAttribute)setGeneratorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesFactory getTraitTypesFactory() {
-        return (TraitTypesFactory)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
-        listOfValuesEClass = createEClass(LIST_OF_VALUES);
-        createEReference(listOfValuesEClass, LIST_OF_VALUES__ENTRIES);
-
-        setGeneratorEClass = createEClass(SET_GENERATOR);
-        createEAttribute(setGeneratorEClass, SET_GENERATOR__ALGORITHM);
-        createEAttribute(setGeneratorEClass, SET_GENERATOR__EXPRESSION);
-    }
-
-    /**
-     * <!-- 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(listOfValuesEClass, ListOfValues.class, "ListOfValues", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getListOfValues_Entries(), theXMLTypePackage.getSimpleAnyType(), null, "entries", null, 0, -1, ListOfValues.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(setGeneratorEClass, SetGenerator.class, "SetGenerator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getSetGenerator_Algorithm(), ecorePackage.getEString(), "algorithm", null, 0, 1, SetGenerator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getSetGenerator_Expression(), ecorePackage.getEString(), "expression", null, 0, 1, SetGenerator.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
-          (getListOfValues_Entries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "item"
-           });		
-        addAnnotation
-          (getSetGenerator_Algorithm(), 
-           source, 
-           new String[] {
-             "kind", "element"
-           });		
-        addAnnotation
-          (getSetGenerator_Expression(), 
-           source, 
-           new String[] {
-             "kind", "element"
-           });
-    }
-
-} //TraitTypesPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java
deleted file mode 100644
index 3261477..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesAdapterFactory.java,v 1.4 2007/04/16 19:54:18 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.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.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- 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.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public class TraitTypesAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static TraitTypesPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = TraitTypesPackage.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 TraitTypesSwitch modelSwitch =
-        new TraitTypesSwitch() {
-            public Object caseListOfValues(ListOfValues object) {
-                return createListOfValuesAdapter();
-            }
-            public Object caseSetGenerator(SetGenerator object) {
-                return createSetGeneratorAdapter();
-            }
-            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.common.metadata.traittypes.traittypes.ListOfValues <em>List Of Values</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.common.metadata.traittypes.traittypes.ListOfValues
-     * @generated
-     */
-    public Adapter createListOfValuesAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator <em>Set Generator</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.common.metadata.traittypes.traittypes.SetGenerator
-     * @generated
-     */
-    public Adapter createSetGeneratorAdapter() {
-        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;
-    }
-
-} //TraitTypesAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java
deleted file mode 100644
index 6a187a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesResourceFactoryImpl.java,v 1.3 2007/02/28 21:12:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.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.common.metadata.traittypes.traittypes.internal.util.TraitTypesResourceImpl
- * @generated
- */
-public class TraitTypesResourceFactoryImpl extends ResourceFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesResourceFactoryImpl() {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Resource createResource(URI uri) {
-        XMLResource result = new TraitTypesResourceImpl(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;
-    }
-
-} //TraitTypesResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java
deleted file mode 100644
index ab734a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesResourceImpl.java,v 1.3 2007/02/28 21:12:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.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.common.metadata.traittypes.traittypes.internal.util.TraitTypesResourceFactoryImpl
- * @generated
- */
-public class TraitTypesResourceImpl extends XMLResourceImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public TraitTypesResourceImpl(URI uri) {
-        super(uri);
-    }
-
-} //TraitTypesResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java
deleted file mode 100644
index e3dc79d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesSwitch.java,v 1.6 2007/10/01 04:29:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- 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.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public class TraitTypesSwitch {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static TraitTypesPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesSwitch() {
-        if (modelPackage == null) {
-            modelPackage = TraitTypesPackage.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 -->
-     * <!-- end-user-doc -->
-     * @param theEObject 
-     * @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 -->
-     * <!-- end-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @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 -->
-     * <!-- end-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(int classifierID, EObject theEObject) {
-        switch (classifierID) {
-            case TraitTypesPackage.LIST_OF_VALUES: {
-                ListOfValues listOfValues = (ListOfValues)theEObject;
-                Object result = caseListOfValues(listOfValues);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case TraitTypesPackage.SET_GENERATOR: {
-                SetGenerator setGenerator = (SetGenerator)theEObject;
-                Object result = caseSetGenerator(setGenerator);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>List Of Values</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>List Of Values</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseListOfValues(ListOfValues object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Set Generator</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>Set Generator</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseSetGenerator(SetGenerator 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;
-    }
-
-} //TraitTypesSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java
deleted file mode 100644
index 2db7356..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesXMLProcessor.java,v 1.4 2007/04/16 19:54:18 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesXMLProcessor extends XMLProcessor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesXMLProcessor() {
-        super((EPackage.Registry.INSTANCE));
-        TraitTypesPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the TraitTypesResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected Map getRegistrations() {
-        if (registrations == null) {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new TraitTypesResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new TraitTypesResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //TraitTypesXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/package-info.java
deleted file mode 100644
index 76e2245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * Common meta-data traits. 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.java
deleted file mode 100644
index 8bc2881..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.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.jsf.common.sets;
-
-import java.util.Set;
-
-/**
- * A java.util.Set with the basic mathematic set axioms of 
- * extensionality (equality), union, intersection, 
- * relative complement (set subtraction) and empty (already 
- * supported by Set).
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface AxiomaticSet extends Set 
-{
-    /**
-     * Implementations should aim to provide O(mn) time cost
-     * where n is the number of elements in this set and
-     * m is the cost to check membership of an element in this
-     * set in toSet.  When a set is itself a member of a set,
-     * the implementation must call isEquivalent on those subsets
-     * recursively.
-     * 
-     * @param toSet 
-     * 
-     * @return true iff this set is equivalent toSet.  Note
-     * that extensionality holds that two sets are equivalent
-     * if and only if they contain exactly the same elements.
-     * 
-     *
-     */
-    boolean isEquivalent(AxiomaticSet toSet);
-    
-    /**
-     * @param set
-     * @return the axiomatic union of this set with set
-     */
-    AxiomaticSet union(AxiomaticSet set);
-    
-    
-    /**
-     * @param set
-     * @return the axiomatic intersection of this set with set
-     */
-    AxiomaticSet intersect(AxiomaticSet set);
-    
-    /**
-     * @param set
-     * @return convenience method that must be equivalent to
-     * (this.intersect(set).isEmpty())
-     */
-    boolean isDisjoint(AxiomaticSet set);
-    
-    /**
-     * The set constructed by the removing the intersection
-     * of this with set from this.  The set will contain all
-     * elements in this that are not in set.
-     * 
-     * Eqivalence: this - set
-     * 
-     * @param set
-     * @return the relative complement or theoretic difference of 
-     * set from this
-     */
-    AxiomaticSet subtract(AxiomaticSet set);
-    
-    /**
-     * @return the first element in the set.  There is no guarantee which element
-     * will be chosen, but the call should always return the same element of the set
-     * for multiple invocations on the same set.  Generally this is a convience method
-     * for when the set only contains one element.
-     * 
-     * @throws java.util.NoSuchElementException if the set is empty.
-     */
-    Object getFirstElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.java
deleted file mode 100644
index baf9f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.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.jsf.common.sets;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Generic (unoptimized) utilities for doing set operations.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class AxiomaticSetUtil 
-{
-    /**
-     * Creates the union of firstSet and secondSet in newSet.
-     * @param newSet
-     * @param firstSet
-     * @param secondSet
-     */
-    public static void union(AxiomaticSet newSet, AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        newSet.addAll(firstSet);
-        newSet.addAll(secondSet);
-    }
-    
-    /**
-     * Creates an intersection of firstSet and secondSet in newSet
-     * @param newSet
-     * @param firstSet
-     * @param secondSet
-     */
-    public static void intersect(AxiomaticSet newSet, AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        // minor optimization: always iterate through the smaller of the
-        // two sets.  This way we iterate through the smallest number
-        // of elements
-        Iterator it = null;
-        Set  testSet = null;
-        // if other set smaller, get its iterator
-        if (secondSet.size() < firstSet.size())
-        {
-            it = secondSet.iterator();
-            // test set is other set
-            testSet = firstSet;
-        }
-        // first set is smaller or same
-        else
-        {
-            it = firstSet.iterator();
-            testSet = secondSet;
-        }
-        
-        while (it.hasNext())
-        {
-            Object member = it.next();
-            if (testSet.contains(member))
-            {
-                newSet.add(member);   
-            }
-        }
-    }
-    
-    /**
-     * @param firstSet
-     * @param secondSet
-     * @return true firstSet and secondSet have no common elements (their intersection is empty)
-     */
-    public static boolean isDisjoint(AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        return firstSet.intersect(secondSet).isEmpty();
-    }
-
-    /**
-     * @param firstOperand
-     * @param secondOperand
-     * @return the set formed by removing the intersection of firstOperand and secondOperand
-     * from firstOperand, leaving only those elements in firstOperand that are not in secondOperand
-     */
-    public static AxiomaticSet subtract(
-            AxiomaticSet firstOperand, AxiomaticSet secondOperand) 
-    {
-        ConcreteAxiomaticSet  relativeComplement = new ConcreteAxiomaticSet();
-
-        // iterate through firstOperand and add each element to the result
-        // set that is not in secondOperand
-        for (final Iterator it = firstOperand.iterator(); it.hasNext();)
-        {
-            Object member = it.next();
-            if (!secondOperand.contains(member))
-            {
-                relativeComplement.add(member);   
-            }
-        }
-
-        return relativeComplement;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java
deleted file mode 100644
index b82c03f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java
+++ /dev/null
@@ -1,58 +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.sets;
-
-import java.util.HashSet;
-
-/**
- * Implements a simple axiomatic set based on a hashset
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ConcreteAxiomaticSet extends HashSet implements AxiomaticSet {
-
-    /**
-     * serial version id
-     */
-    private static final long serialVersionUID = 7094728081135008203L;
-
-    public AxiomaticSet intersect(AxiomaticSet set) {
-        AxiomaticSet intersection = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.intersect(intersection, this, set);
-        return intersection;
-    }
-
-    public boolean isEquivalent(AxiomaticSet toSet) {
-        return equals(toSet);
-    }
-
-    public AxiomaticSet union(AxiomaticSet set) {
-       AxiomaticSet union = new ConcreteAxiomaticSet();
-       AxiomaticSetUtil.union(union, this, set);
-       return union;
-    }
-
-    public boolean isDisjoint(AxiomaticSet set) {
-        return AxiomaticSetUtil.isDisjoint(this, set);
-    }
-
-    public Object getFirstElement() {
-        return iterator().next();
-    }
-
-    public AxiomaticSet subtract(AxiomaticSet set) {
-       return AxiomaticSetUtil.subtract(this, set);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.java
deleted file mode 100644
index 146b833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.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.common.sets;
-
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.w3c.dom.NodeList;
-
-/**
- * A set backed by a W3C NodeList so as to avoid copying.  Note that operations
- * that return new sets still invoke a copy.  Also, membership operations
- * require O(n) time.  This should generally used for sets that are assumed to be
- * small where O(n) search time will be small compared to doing a full copy.
- * 
- * This set is immutable (mutation methods throw exceptions)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class NodeSet extends AbstractSet implements AxiomaticSet 
-{
-    private NodeList        _data;
-    
-    /**
-     * @param data  -- wrap the actual data source
-     */
-    public NodeSet(NodeList data)
-    {
-        _data = data;
-    }
-    
-    public Iterator iterator() {
-        return new Iterator()
-        {
-            private int  pos = 0;
-            
-            public boolean hasNext() {
-                return pos < _data.getLength();
-            }
-
-            public Object next() {
-                return _data.item(pos++);
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-            
-        };
-    }
-
-    public int size() {
-        return _data.getLength();
-    }
-
-    public AxiomaticSet intersect(AxiomaticSet set) {
-        ConcreteAxiomaticSet newSet = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.intersect(newSet, this, set);
-        return newSet;
-    }
-
-    public boolean isEquivalent(AxiomaticSet toSet) {
-        if (this == toSet)
-        {
-            return true;
-        }
-        
-        if (toSet instanceof NodeSet
-                && ((NodeSet)toSet)._data == this._data)
-        {
-            return true;
-        }
-        
-        // if different sizes, false
-        if (toSet.size() != size())
-        {
-            return false;
-        }
-        
-        // otherwise, compare item by item
-        // Iterator through me with the hope that look ups
-        // are more efficent in toSet 
-        for (Iterator it = iterator(); it.hasNext();)
-        {
-            Object obj = it.next();
-            
-            if (!toSet.contains(obj))
-            {
-                // fail fase on membership mismatch
-                return false;
-            }
-        }
-        
-        // if we get to here then the item by item match succeeded
-        return true;
-    }
-
-    public AxiomaticSet union(AxiomaticSet set) {
-        ConcreteAxiomaticSet newSet = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.union(newSet, this, set);
-        return newSet;
-    }
-
-    public boolean isDisjoint(AxiomaticSet set) {
-        return AxiomaticSetUtil.isDisjoint(this, set);
-    }
-
-    public Object getFirstElement() {
-        if (_data.getLength()>0)
-        {
-            return _data.item(0);
-        }
-        throw new NoSuchElementException("Set is empty"); //$NON-NLS-1$
-    }
-
-    public AxiomaticSet subtract(AxiomaticSet set) {
-        return AxiomaticSetUtil.subtract(this, set);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.java
deleted file mode 100644
index d71ebf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.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.common.sets.constraint;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * A set constraint that is specific to members of the set.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class AbstractMemberConstraint extends AbstractSetConstraint {
-
-    public Diagnostic isSatisfied(AxiomaticSet set) {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.java
deleted file mode 100644
index f176a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.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.common.sets.constraint;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * Super-class of all axiomatic set constraints.
- * 
- * A set constraint applies one or more pre-conditions on a set
- * and returns a diagnostic that flags whether or not the set
- * satisfies that constraint or not.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSetConstraint 
-{
-    /**
-     * The following post-conditions must hold:
-     * 
-     * 1) if the set satisfies the constraint with no caveats, 
-     * the returned diagnostic must in turn satisfy 
-     * Diagnostic.getSeverity() == Diagnostic.OK
-     * 
-     * 2) if the set does not satisfy the constraint, the returned diagnostic
-     * must satisfy Diagnostic.getSeverity() == Diagnostic.ERROR
-     * 
-     * 3) if the set strictly satisfies the constraint but the constraint includes
-     * parameters that can only be heuristically applied, the constraint may choose
-     * to return a diagnostic where Diagnostic.getSeverity() == Diagnostic.WARNING
-     * 
-     * The diagnostic returned should _never_ have any other severity but OK, ERROR or WARNING
-     * 
-     * Algorithmically:
-     * 
-     * Constraint is satisfied can be tested by Diagnostic.getSeverity() != ERROR
-     * Constraint is not satisfied can be tested by Diagnostic.getSeverity() == ERROR
-     * 
-     * @param set
-     * @return a diagnostic object that contains information about whether
-     * or not the constraint is satisfied for set. 
-     * <b>MUST NOT RETURN NULL</b>
-     */
-    public abstract Diagnostic isSatisfied(AxiomaticSet set);
-    
-    /**
-     * Convenience method
-     * 
-     * @param set
-     * @return true if the constraint is satisfied for set
-     */
-    public final boolean passesConstraint(AxiomaticSet set)
-    {
-        return isSatisfied(set).getSeverity() != Diagnostic.ERROR;
-    }
-    
-    /**
-     * Convenience method
-     * 
-     * @param set
-     * @return true if the constraint is <b>not</b> satisfied for set
-     */
-    public final boolean failsConstraint(AxiomaticSet set)
-    {
-        return !passesConstraint(set);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/package-info.java
deleted file mode 100644
index 94a9016..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * Classes for creating validation constraints on sets. 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.sets.constraint;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java
deleted file mode 100644
index 8c2d5b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java
+++ /dev/null
@@ -1,75 +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.sets.mapping;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-
-/**
- * Super-class of all ObjectInjectiveSetMapping.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractObjectInjectiveSetMapping implements
-        ObjectInjectiveSetMapping {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.sets.mapping.ObjectInjectiveSetMapping#mapIterator(org.eclipse.jst.jsf.common.sets.AxiomaticSet)
-     */
-    public Iterator mapIterator(final AxiomaticSet set) 
-    {
-        return new Iterator()
-        {
-            final Iterator  setIterator = set.iterator();
-            
-            public boolean hasNext() 
-            {
-                return setIterator.hasNext();
-            }
-
-            public Object next() 
-            {
-                return map(setIterator.next());
-            }
-
-            public void remove() 
-            {
-                throw new UnsupportedOperationException("cannot modify iterator"); //$NON-NLS-1$
-            }
-        };
-    }
-
-    /**
-     * @param element
-     * @return the result object from the mapping on element
-     */
-    public abstract Object map(Object element);
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.sets.mapping.AxiomaticSetMapping#map(org.eclipse.jst.jsf.common.sets.AxiomaticSet)
-     */
-    public final AxiomaticSet map(AxiomaticSet set) {
-       AxiomaticSet resultSet = new ConcreteAxiomaticSet();
-       
-       for (final Iterator it = mapIterator(set); it.hasNext();)
-       {
-           resultSet.add(it.next());
-       }
-       
-       return resultSet;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.java
deleted file mode 100644
index d6ab1ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.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.jsf.common.sets.mapping;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * Defines an axiomatic mapping from set to another.  In formal notation, this may
- * also be defined as a "function" or a "proposition".
- * 
- * Applying the map method can be seen as being equivalent to:
- * 
- * AxiomaticSetMapping: set -> map(set)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface AxiomaticSetMapping 
-{
-    /**
-     * @param set
-     * @return the new set resulting from applying the map to set
-     */
-    AxiomaticSet map(AxiomaticSet set);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java
deleted file mode 100644
index ce33eec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java
+++ /dev/null
@@ -1,70 +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.sets.mapping;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * A type of axiomatic set mapping that operates injectively on the input
- * set to create its result set.  Note that the injection (one-to-oneness)
- * of the mapping is based on Java objects and not on the value of the object.
- * Therefore, the result set is not guaranteed to be injective on the basis
- * of value.
- * 
- * For example, consider a set of integers:
- * 
- * X = {new Integer(4), new Integer(6), new Integer(9)}
- * 
- * an ObjectInjectiveSetMapping may be defined that maps this set
- * to a result based on:
- * 
- * map(x) = new Boolean(x < 8) for all x in X
- * 
- * An ObjectiveInjectiveSetMapping result set would look like this:
- * 
- * map(X) = {new Boolean(true), new Boolean(true), new Boolean(false)}
- * 
- * Note that boolean TRUE maps twice, so based on the value of the set members,
- * the mapping is not injective.  However, each Java object in X maps to a
- * distinct Java object in map(X)
- * 
- * This interface should not be implemented by clients. Clients should
- * sub-class AbstractObjectInjectiveSetMapping to avoid future API breakage.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ObjectInjectiveSetMapping extends AxiomaticSetMapping
-{
-    /**
-     * This method optimizes the case where a client wants to apply some
-     * mapping or constraint to each element of a set until a particular
-     * condition applies and then stop.
-     * 
-     * Mapping's that implement this
-     * interface should generally implement their map(set) method as:
-     * 
-     *  for (Iterator it = mapIterator(set); it.hasNext();)
-     *  {
-     *      result.add(doMapping(it.next));
-     *  }
-     *  
-     * @param set
-     * @return an iterator that allows a client to apply the mapping
-     * one element of set at a time.  The iterator is immutable and should
-     * throw UnsupportedOperationException if remove() is called.
-     */
-    public Iterator mapIterator(AxiomaticSet set);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/package-info.java
deleted file mode 100644
index 8a7dacc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * Classes for creating member mappings between sets.  
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.sets.mapping;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/package-info.java
deleted file mode 100644
index 7448837..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * Axiomatic Sets framework.
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.sets;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
deleted file mode 100644
index 526d717..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
+++ /dev/null
@@ -1,213 +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.common.util;
-
-import java.beans.Introspector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.Flags;
-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.JSFCommonPlugin;
-
-/**
- * A class that does bean introspection on a JDT IType
- * 
- * This functionality is not meant to replace runtime bean 
- * introspection.  Rather, it is meant to provide a 
- * more "lightweight" (in terms of class loading as well as
- * error handling of bean instantiation out of context) way
- * to determine a bean's properties at design time.
- * 
- * This class may not be sub-classed by clients.
- * 
- * @author cbateman
- *
- */
-public class JDTBeanIntrospector 
-{
-	private final static String GET_PREFIX = "get"; //$NON-NLS-1$
-	private final static String SET_PREFIX = "set"; //$NON-NLS-1$
-	private final static String IS_PREFIX = "is"; //$NON-NLS-1$
-	
-	private final IType 	_type;
-
-	/**
-	 * @param type
-	 */
-	public JDTBeanIntrospector(IType type)
-	{
-		_type = type;
-	}
-	
-	/**
-	 * @return an map of all properties with the property names
-     * as keys and the values being JDTBeanProperty objects representing
-     * the properties.
-	 */
-	public Map<String, JDTBeanProperty> getProperties()
-	{
-		final Map<String, JDTBeanProperty>   propertiesWorkingCopy = 
-		    new HashMap<String, JDTBeanProperty>();
-		final IMethod[] methods = getAllMethods();
-		
-		for (int i = 0; i < methods.length; i++)
-		{
-			final IMethod  method = methods[i];
-
-			try
-			{
-				processPropertyMethod(method, propertiesWorkingCopy);
-			}
-			catch (JavaModelException jme)
-			{
-				// log and then proceed to next method
-				JSFCommonPlugin.log(jme, "Error processing IMethod for bean property info"); //$NON-NLS-1$
-			}
-		}
-
-        final Map properties = new HashMap();
-        
-        for (Entry<String, JDTBeanProperty> entry : propertiesWorkingCopy.entrySet())
-        {
-            final String key = entry.getKey();
-            JDTBeanPropertyWorkingCopy  wcopy = (JDTBeanPropertyWorkingCopy) entry.getValue();
-            properties.put(key, wcopy.toValueObject());
-        }
-
-		return properties;
-	}
-
-	private void processPropertyMethod(IMethod method, Map<String, JDTBeanProperty> properties) throws JavaModelException
-	{
-		// to be a bean method, it must not a constructor, must be public
-		// and must not be static
-		if (!method.isConstructor()
-				&& ( Flags.isPublic(method.getFlags())
-				        || _type.isInterface())
-				&& !Flags.isStatic(method.getFlags()))
-		{
-			final String methodName = method.getElementName();
-			final String returnType = method.getReturnType();
-			
-			// either starts with get or is boolean and starts with is
-			
-			// is access must start with 'is', have a boolean return type and no parameters
-			final boolean  startsWithIs = methodName.startsWith(IS_PREFIX) 
-					&& Signature.SIG_BOOLEAN.equals(returnType)
-					&& method.getNumberOfParameters() == 0
-                    && methodName.length() > IS_PREFIX.length();
-			
-			// get accessor must start with 'get', have no parameters and return non-void
-			final boolean  startsWithGet = (methodName.startsWith(GET_PREFIX)
-											&& method.getNumberOfParameters() == 0)
-											&& !Signature.SIG_VOID.equals(returnType)                    
-                                            && methodName.length() > GET_PREFIX.length();
-			
-			// mutator must start with 'set' and have one parameter and a void return type
-			final boolean  startsWithSet = methodName.startsWith(SET_PREFIX)
-											&& method.getNumberOfParameters() == 1
-											&& Signature.SIG_VOID.equals(returnType)
-                                            && methodName.length() > SET_PREFIX.length();
-
-			if (startsWithGet || startsWithSet || startsWithIs)
-			{
-				final String propertyName = 
-					Introspector.decapitalize(methodName.substring(startsWithIs ? 2 : 3));
-
-				JDTBeanPropertyWorkingCopy workingCopy = 
-					(JDTBeanPropertyWorkingCopy) properties.get(propertyName);
-
-				if (workingCopy == null)
-				{
-					workingCopy = new JDTBeanPropertyWorkingCopy(_type);
-					properties.put(propertyName, workingCopy);
-				}
-
-				if  (startsWithIs)
-				{
-					workingCopy.setIsGetter(method);
-				}
-				else if (startsWithGet)
-				{
-					workingCopy.setGetter(method);
-				}
-				else if (startsWithSet)
-				{
-					workingCopy.addSetter(method);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return all methods for the type including inherited ones
-	 */
-	public IMethod[] getAllMethods()
-	{
-		IMethod[] methods = new IMethod[0];
-		
-		try
-		{
-            // type not resolved so don't proceed
-            if (_type != null)
-            {
-	            // TODO: type hierarchy is potentially expensive, should
-	            // cache once and listen for changes
-	            ITypeHierarchy  hierarchy = _type.newSupertypeHierarchy(new NullProgressMonitor());
-	            
-				methods = getAllMethods(hierarchy, _type);
-            }
-		}
-		catch(JavaModelException jme)
-		{
-            JSFCommonPlugin.log(jme, "Error getting type information for bean"); //$NON-NLS-1$
-		}
-
-		return methods;
-	}
-
-    /**
-     * @param typeHierarchy
-     * @param type
-     * @return all methods of the type and it's super types
-     */
-    private static IMethod[] getAllMethods(final ITypeHierarchy typeHierarchy, final IType type)
-    {
-        final List<IMethod>   methods = new ArrayList<IMethod>();
-        final IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-        final IType[] closure = new IType[superTypes.length+1];
-        closure[0] = type;
-        System.arraycopy(superTypes, 0, closure, 1, superTypes.length);
-        
-        for (int i = 0; i < closure.length; i++)
-        {
-            try {
-                final IType superType = closure[i];
-                methods.addAll(Arrays.asList(superType.getMethods()));
-            } catch (JavaModelException e) {
-                JSFCommonPlugin.log(e, "Error getting super type information for bean"); //$NON-NLS-1$
-            }
-        }
-            
-        return methods.toArray(new IMethod[methods.size()]);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java
deleted file mode 100644
index 3f92f83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java
+++ /dev/null
@@ -1,250 +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.common.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Represents a single bean property backed by JDT data
- * 
- * This class may not be sub-classed by clients.
- * 
- * @author cbateman
- *
- */
-public class JDTBeanProperty 
-{
-	/**
-	 * the IMethod for the accessor  (either is or get)
-	 */
-	private IMethod   _getter;
-	
-	/**
-	 * the IMethod for a "set" accessor method
-	 */
-	private IMethod   _setter;
-
-	/**
-	 * The IType that this property belongs to
-	 */
-	protected final IType    _type;
-    
-    /**
-     * @param type
-     */
-    protected JDTBeanProperty(IType type)
-    {
-        _type = type;
-    }
-
-    /**
-	 * @return true if this property is readable
-	 */
-	public boolean isReadable()
-	{
-		return  _getter != null;
-	}
-	
-	/**
-	 * @return true if this property is writable
-	 */
-	public boolean isWritable()
-	{
-		return _setter != null;
-	}
-	
-	
-	/**
-	 * @return the get accessor IMethod or null if none
-	 */
-	public IMethod getGetter() {
-		return _getter;
-	}
-
-	
-	
-	/**
-	 * Set the get accessor IMethod
-	 * @param getter -- may be null to indicate none
-	 */
-	void setGetter(IMethod getter) {
-		_getter = getter;
-	}
-
-
-	/**
-	 * @return the set mutator IMethod or null if none
-	 */
-	public IMethod getSetter() {
-		return _setter;
-	}
-
-	/**
-	 * @param setter
-	 */
-	void setSetter(IMethod setter) {
-		_setter = setter;
-	}
-	
-    /**
-     * @return the IType for this property's type or null if it
-     * cannot determined.  Note that null does not necessarily indicate an error
-     * since some types like arrays of things do not have corresponding JDT IType's
-     * If typeSignature represents an array, the base element IType is returned
-     * if possible
-     */
-    public IType getType()
-    {
-        final String typeSignature = Signature.getElementType(getTypeSignature());
-        return TypeUtil.resolveType(_type, typeSignature);
-    }
-	
-    /**
-     * @return the number of array nesting levels in typeSignature.
-     * Returns 0 if not an array.
-     */
-    public int getArrayCount()
-    {
-        return Signature.getArrayCount(getTypeSignature());
-    }
-    
-    /**
-     * @return true if property is an enum type, false otherwise or if cannot be resolved
-     */
-    public boolean isEnumType()
-    {
-        return TypeUtil.isEnumType(getType());
-    }
-    
-	/**
-	 * Fully equivalent to:
-	 * 
-	 * getTypeSignature(true)
-	 * 
-	 * @return the fully resolved (if possible) type signature for
-     * the property or null if unable to determine.
-     * 
-     * NOTE: this is the "type erasure" signature, so any type parameters
-     * will be removed and only the raw type signature will be returned.
-	 */
-	public String getTypeSignature()
-    {
-	    return getTypeSignature(true);
-    }
-	
-	
-    /**
-     * @param eraseTypeParameters if true, the returned type has type parameters
-     * erased. If false, template types are resolved. 
-     * 
-     * @see org.eclipse.jst.jsf.common.util.TypeUtil#resolveTypeSignature(IType, String, boolean)
-     * for more information on how specific kinds of unresolved generics are resolved
-     * 
-     * @return the fully resolved (if possible) type signature for
-     * the property or null if unable to determine.
-     */
-    public String getTypeSignature(boolean eraseTypeParameters)
-    {
-        try
-        {
-            String unResolvedSig = getUnresolvedType();
-            return TypeUtil.resolveTypeSignature(_type, unResolvedSig, eraseTypeParameters);
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-            return null;
-        }
-    }
-    
-	/**
-	 * For example, if this property was formed from: List<String> getListOfStrings()
-	 * then the list would consist of the signature "Ljava.lang.String;".  All 
-	 * nested type paramters are resolved
-	 * 
-     * @see org.eclipse.jst.jsf.common.util.TypeUtil#resolveTypeSignature(IType, String, boolean)
-     * for more information on how specific kinds of unresolved generics are resolved
-	 * 
-	 * @return a list of type signatures (fully resolved if possible)
-	 * of this property's bounding type parameters.
-	 */
-	public List<String> getTypeParameterSignatures()
-	{
-	    List<String>  signatures = new ArrayList<String>();
-	    
-	    try
-	    {
-	        final String[] typeParameters = Signature.getTypeArguments(getUnresolvedType());
-	        //System.err.println(getUnresolvedType());
-	        for (String parameter : typeParameters)
-	        {
-	            //System.out.println(parameter);
-	            signatures.add(TypeUtil.resolveTypeSignature(_type, parameter, false));
-	        }
-	    }
-	    catch (JavaModelException jme)
-	    {
-            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-            // fall-through and return empty array
-	    }
-
-	    return signatures;
-	}
-
-//	public Map<String, String> getTypeParameterSignatureMap()
-//	{
-//	    Map<String, String>  signatures = new HashMap<String, String>();
-//        
-//        try
-//        {
-//            final String[] typeParameters = Signature.getTypeArguments(getUnresolvedType());
-//            
-//            for (String parameter : typeParameters)
-//            {
-//                signatures.add(TypeUtil.resolveTypeSignature(_type, parameter, false));
-//            }
-//        }
-//        catch (JavaModelException jme)
-//        {
-//            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-//            // fall-through and return empty array
-//        }
-//
-//        return signatures;
-//	}
-	
-    private String getUnresolvedType() throws JavaModelException
-    {
-        String   typeSig = null;
-        
-        // first decide which method to use; getter always gets precendence
-        if (_getter != null)
-        {
-            typeSig = _getter.getReturnType();
-        }
-        // TODO: if no getter or setter could we have been created?
-        // use setter
-        else
-        {
-            typeSig = _setter.getParameterTypes()[0];
-        }
-        
-        return typeSig;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java
deleted file mode 100644
index f3bdf14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java
+++ /dev/null
@@ -1,163 +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.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * A writable version of the JDTBeanProperty object
- * 
- * This class may not be sub-classed by clients
- * 
- * @author cbateman
- *
- */
-public class JDTBeanPropertyWorkingCopy extends JDTBeanProperty 
-{
-	private final List		_setters;
-	
-	/**
-	 * the IMethod for the boolean "is" accessor method
-	 */
-	private IMethod        _isGetter;
-	
-	/**
-	 * Constructor
-	 * @param type 
-	 */
-	public JDTBeanPropertyWorkingCopy(IType type)
-	{
-        super(type);
-		_setters = new ArrayList();
-	}
-	
-	/**
-	 * @return the bean properties spawned from this working copy
-	 * Normally, there is only one property in the array, however,
-	 * since this working copy represents all properties with the same
-	 * name, there could be multiple properties since setters can
-	 * be overloaded by name and could result in zero or one readable
-	 * properties plus zero or more write-only properties with the same
-	 * name.  I can't see anywhere in the spec that covers this 
-	 * boundary case
-	 */
-	public JDTBeanProperty toValueObject()
-	{
-		// if the isGetter is present that it takes precedence
-		// over the the normal getter
-		IMethod  getter = getIsGetter() != null ? 
-							getIsGetter() : getGetter();
-		IMethod  matchedSetter = null;
-
-		if (getter != null)
-		{
-			matchedSetter = determineMatchedSetter(getter);
-		}
-		// if there's no getter than pick any setter: there
-		// are bigger problem when there's no getter than
-		// ambiguous setters
-		else if (_setters.size() > 0)
-		{
-			matchedSetter = (IMethod) _setters.get(0);
-		}
-		
-		JDTBeanProperty beanProp = new JDTBeanProperty(_type);
-		beanProp.setGetter(getter);
-		beanProp.setSetter(matchedSetter);
-		return beanProp;
-	}
-	
-	private IMethod determineMatchedSetter(IMethod getter)
-	{
-		IMethod matchedSetter = null;
-		
-		try
-		{
-			final String getterSig = 
-				TypeUtil.resolveTypeSignature(_type, getter.getReturnType());
-
-			FIND_MATCHING_SETTER:for 
-				(final Iterator it = _setters.iterator(); it.hasNext();)
-			{
-				final IMethod  setter = (IMethod) it.next();
-				if (setter.getNumberOfParameters() == 1)
-				{
-					final String paramSig = 
-						TypeUtil.resolveTypeSignature
-							(_type,setter.getParameterTypes()[0]);
-					
-					if (paramSig.equals(getterSig))
-					{
-						// we've found our match since only one
-						// setter with the same name as the getter
-						// can have the same matching type for a
-						// single arg method
-						matchedSetter = setter;
-						break FIND_MATCHING_SETTER;
-					}
-				}
-			}
-		}
-		catch (JavaModelException jme)
-		{
-            JSFCommonPlugin.log(jme, "Error determining getter return type, bean properties analysis may be inaccurate"); //$NON-NLS-1$
-		}
-
-		return matchedSetter;
-	}
-	
-	//@Override
-	public void setGetter(IMethod getter) {
-		super.setGetter(getter);
-	}
-
-	/**
-	 * @param isGetter
-	 */
-	public void setIsGetter(IMethod isGetter) {
-		_isGetter = isGetter;
-	}
-
-	/**
-	 * @param setter
-	 */
-	public void addSetter(IMethod setter) {
-        if (setter != null
-                && setter.getNumberOfParameters() == 1)
-        {
-            _setters.add(setter);
-        }
-	}
-
-    /**
-     * Not supported on working copy.  This is synthetically generated
-     * on toValueObject()
-     * @return nothing; throws exception
-     */
-    public final IMethod getSetter()
-    {
-        throw new UnsupportedOperationException("Setter not calculated in working copy.  Call toValueObject().getSetter()"); //$NON-NLS-1$
-    }
-    
-	/**
-	 * @return the "is" getter method or null if not found
-	 */
-	public IMethod getIsGetter() {
-		return _isGetter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java
deleted file mode 100644
index d781689..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java
+++ /dev/null
@@ -1,597 +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.common.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeParameter;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-
-/**
- * Utility for handling IType's and type signatures
- * 
- * Class is static and cannot be extended or instantiated.
- * 
- * @author cbateman
- *
- */
-public final class TypeUtil 
-{
-    static IType resolveType(final IType owningType, final String typeSignature)
-    {
-        // if type signature is already resolved then simply look it up
-        if (typeSignature.charAt(0) == Signature.C_RESOLVED
-        		|| (Signature.getTypeSignatureKind(typeSignature) == Signature.BASE_TYPE_SIGNATURE)
-        		|| (Signature.getTypeSignatureKind(typeSignature) == Signature.ARRAY_TYPE_SIGNATURE
-        			&& Signature.getElementType(typeSignature).charAt(0) == Signature.C_RESOLVED))
-        {
-            IType type = null;
-            
-            try
-            {
-                type = owningType.getJavaProject().
-                           findType(getFullyQualifiedName(typeSignature));
-            }
-            catch (JavaModelException jme)
-            {
-                // do nothing; return type == null;
-            }
-            
-            return type;
-        }
-        
-        
-        return resolveTypeRelative(owningType, typeSignature);
-    }
-
-    /**
-     * Fully equivalent to:
-     * 
-     * #resolveTypeSignature(owningType, typeSignature, true)
-     * 
-     * If resolved, type signature has generic type parameters erased (absent).
-     * 
-     * @param owningType
-     * @param typeSignature
-     * @return the resolved type signature for typeSignature in owningType or
-     * typeSignature unchanged if cannot resolve.
-     */
-    public static String resolveTypeSignature(final IType owningType, final String typeSignature)
-    {
-        return resolveTypeSignature(owningType, typeSignature, true);
-    }
-    
-    /**
-     * Resolve typeSignature in the context of owningType.  This method will return 
-     * a type erased signture if eraseTypeParameters == true and will attempt to
-     * resolve and include parameters if eraseTypeParamters == false
-     * 
-     * NOTE: special rules apply to the way unresolved type parameters and wildcards
-     * are resolved:
-     * 
-     * 1) If a fully unresolved type parameter is found, then it will be replaced with Ljava.lang.Object;
-     * 
-     * i.e.  List<T>  -> Ljava.util.List<Ljava.lang.Object;>;  for any unresolved T.
-     * 
-     * 2) Any bounded wildcard will be replaced by the bound:
-     * 
-     * i.e. List<? extends String> -> Ljava.util.List<Ljava.lang.String;>;
-     * i.e. List<? super String> -> Ljava.util.List<Ljava.lang.String;>;
-     * 
-     * Note limitation here: bounds that use 'super' will take the "best case" scenario that the list
-     * type is of that type.
-     * 
-     * 3) The unbounded wildcard will be replaced by Ljava.lang.Object;
-     * 
-     * i.e. List<?> -> Ljava.util.List<Ljava.lang.Object;>;
-     * 
-     * 
-     * The reason for this substition is to return the most accurate reasonable approximation
-     * of the type within what is known by owningType
-     * 
-     * @param owningType
-     * @param typeSignature
-     * @param eraseTypeParameters if set to false, type parameters are resolved included
-     * in the signature
-     * @return the resolved type signature for typeSignature in owningType or
-     * typeSignature unchanged if cannot resolve.
-     */
-    public static String resolveTypeSignature(final IType owningType, final String typeSignature, boolean eraseTypeParameters)
-    {
-        final int sigKind = Signature.getTypeSignatureKind(typeSignature);
-    
-        switch (sigKind)
-        {
-            case Signature.BASE_TYPE_SIGNATURE:
-                return typeSignature;
-                
-            case Signature.ARRAY_TYPE_SIGNATURE:
-            {
-                final String elementType = Signature.getElementType(typeSignature);
-                
-                if (Signature.getTypeSignatureKind(elementType) == Signature.BASE_TYPE_SIGNATURE)
-                {
-                    return typeSignature;
-                }
-
-                final String resolvedElementType = resolveSignatureRelative(owningType, elementType, eraseTypeParameters);
-                String resultType = ""; //$NON-NLS-1$
-                for (int i = 0; i < Signature.getArrayCount(typeSignature);i++)
-                {
-                    resultType+=Signature.C_ARRAY;
-                }
-                
-                return resultType+resolvedElementType;
-            }
-
-            case Signature.TYPE_VARIABLE_SIGNATURE:
-            	return resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-            
-            case Signature.CLASS_TYPE_SIGNATURE:
-                return resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-
-            case Signature.WILDCARD_TYPE_SIGNATURE:
-                // strip the wildcard and try again.  Too bad Signature doesn't seem to have a method
-                // for this
-                if (typeSignature.charAt(0) == Signature.C_STAR)
-                {
-                    return TypeConstants.TYPE_JAVAOBJECT;
-                }
-                return resolveTypeSignature(owningType, typeSignature.substring(1), eraseTypeParameters);
-            
-            case Signature.CAPTURE_TYPE_SIGNATURE:
-                // strip the capture and try again
-                return resolveTypeSignature(owningType, Signature.removeCapture(typeSignature), eraseTypeParameters);
-//            case Signature.TYPE_VARIABLE_SIGNATURE:
-//                resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-
-            default:
-                return typeSignature;
-        }
-    }
-    
-    /**
-     * @param owningType -- type relative to which typeSignature will be resolved
-     * @param typeSignature -- non-array type signature
-     * @return the resolved type signature if possible or typeSignature if not
-     */
-    private static String resolveSignatureRelative(final IType owningType, final String typeSignature, final boolean eraseTypeParameters)
-    {
-        // if already fully resolved, return the input
-        if (typeSignature.charAt(0) == Signature.C_RESOLVED)
-        {
-            return typeSignature;
-        }
-
-        List<String> typeParameters = new ArrayList<String>();
-
-        IType resolvedType = resolveTypeRelative(owningType, typeSignature);
-
-        if (resolvedType != null)
-        {
-            if (!eraseTypeParameters)
-            {
-                // ensure that type parameters are resolved recursively
-                for (String typeParam : Signature.getTypeArguments(typeSignature))
-                {
-                    typeParam = Signature.removeCapture(typeParam);
-                    // check and remove bound wildcarding (extends/super/?)
-                    if (Signature.getTypeSignatureKind(typeParam) == Signature.WILDCARD_TYPE_SIGNATURE)
-                    {
-                        // convert ? to Object, strip extends/super
-                        if (typeParam.charAt(0) == Signature.C_STAR)
-                        {
-                            typeParam = TypeConstants.TYPE_JAVAOBJECT;
-                        }
-                        else
-                        {
-                            typeParam = typeParam.substring(1);
-                        }
-                    }
-                    final String resolvedParameter = 
-                    	resolveSignatureRelative(
-                    			// use the enclosing type, 
-                    			// *not* the resolved type because 
-                    			// we need to resolve in that context
-                    			owningType, 
-                    				typeParam, eraseTypeParameters);
-                    typeParameters.add(resolvedParameter);
-                }
-            }
-
-            final String  resolvedTypeSignature = 
-                Signature.createTypeSignature
-                    (resolvedType.getFullyQualifiedName(), true);
-           
-
-            if (typeParameters.size() > 0 && !eraseTypeParameters)
-            {
-                StringBuffer sb = new StringBuffer(resolvedTypeSignature);
-
-                if (sb.charAt(sb.length()-1) == ';')
-                {
-                    sb = sb.delete(sb.length()-1, sb.length());
-                }
-                
-                sb.append("<"); //$NON-NLS-1$
-                for(String param : typeParameters)
-                {
-                    //System.out.println("type param: "+resolvedType.getTypeParameter(param));
-                    sb.append(param);
-                }
-                
-                // replace the dangling ',' with the closing ">"
-                sb.append(">;"); //$NON-NLS-1$
-                return sb.toString();
-            }
-            
-            return resolvedTypeSignature;
-        }
-
-        if (Signature.getTypeSignatureKind(typeSignature) == 
-                Signature.CLASS_TYPE_SIGNATURE
-            || Signature.getTypeSignatureKind(typeSignature)
-                == Signature.TYPE_VARIABLE_SIGNATURE)
-        {
-            // if we are unable to resolve, check to see if the owning type has
-            // a parameter by this name
-            ITypeParameter typeParam = owningType.getTypeParameter(Signature.getSignatureSimpleName(typeSignature));
-            
-            // if we have a type parameter and it hasn't been resolved to a type,
-            // then assume it is a method template placeholder (i.e. T in ArrayList).
-            // at runtime these unresolved parameter variables are effectively 
-            // turned into Object's.  For example, think List.add(E o).  At runtime,
-            // E will behave exactly like java.lang.Object in that signature
-            if (typeParam.exists())
-            {
-                return TypeConstants.TYPE_JAVAOBJECT;
-            }
-            
-            // TODO: is there a better way to handle a failure to resolve
-            // than just garbage out?
-            //JSFCommonPlugin.log(new Exception("Failed to resolve type: "+typeSignature), "Failed to resolve type: "+typeSignature); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        
-        return typeSignature;
-    }
-
-    private static IType resolveTypeRelative(final IType owningType, final String typeSignature)
-    {
-        final String fullName = getFullyQualifiedName(typeSignature);
-        
-        IType resolvedType = null;
-        
-        try
-        {
-            // TODO: this call is only supported on sourceTypes!
-            String[][] resolved = owningType.resolveType(fullName);
-    
-            if (resolved != null && resolved.length > 0)
-            {
-                resolvedType = owningType.getJavaProject().findType(resolved[0][0], resolved[0][1]);
-            }
-            else
-            {
-                resolvedType = resolveInParents(owningType, fullName);
-            }
-        }
-        catch (JavaModelException jme)
-        {
-            //  do nothing; newType == null
-        }
-
-        return resolvedType;
-    }
-
-    /**
-     * @param type
-     * @return a type signature for a type
-     */
-    public static String getSignature(IType type)
-    {
-        final String fullyQualifiedName = type.getFullyQualifiedName();
-        return Signature.createTypeSignature(fullyQualifiedName, true);
-    }
-
-    
-    /**
-     * @param owner
-     * @param unresolvedSignature
-     * @return the resolved method signature for unresolvedSignature in owner
-     */
-    public static String resolveMethodSignature(final IType  owner, 
-                                         final String unresolvedSignature)
-    {
-        
-        final String unresolvedSignatureNormalized =
-            unresolvedSignature.replaceAll("/", ".");
-        
-        // get the list of parameters
-        final String[] parameters = 
-            Signature.getParameterTypes(unresolvedSignatureNormalized);
-        
-        for (int i = 0; i < parameters.length; i++)
-        {
-            // try to full resolve the type
-            parameters[i] = resolveTypeSignature(owner, parameters[i]);
-        }
-        
-        // resolve return type
-        final String resolvedReturn = 
-            resolveTypeSignature(owner, 
-                                  Signature.getReturnType(unresolvedSignatureNormalized));
-        
-        return Signature.createMethodSignature(parameters, resolvedReturn);
-    }
-    
-    /**
-     * @param typeSignature     
-     * @return a fully qualified Java class name from a type signature
-     * i.e. Ljava.lang.String; -> java.lang.String
-     */
-    public static String getFullyQualifiedName(final String typeSignature)
-    {
-        final String packageName = Signature.getSignatureQualifier(typeSignature);
-        final String typeName = Signature.getSignatureSimpleName(typeSignature);
-        return "".equals(packageName) ? typeName : packageName + "." + typeName;  //$NON-NLS-1$//$NON-NLS-2$
-    }
-    
-    private static IType resolveInParents(IType  childType, String fullyQualifiedName)
-                                throws JavaModelException
-    {
-        IType resolvedType = null;
-        
-        // not resolved? try the supertypes
-        final ITypeHierarchy typeHierarchy =
-            childType.newSupertypeHierarchy(new NullProgressMonitor());
-        IType[] superTypes = typeHierarchy.getAllSupertypes(childType);
-        String[][]   resolved;
-        
-        LOOP_UNTIL_FIRST_MATCH:
-            for (int i = 0; i < superTypes.length; i++)
-        {
-            final IType type = superTypes[i];
-
-            resolved = type.resolveType(fullyQualifiedName);
-
-            if (resolved != null && resolved.length > 0)
-            {
-                resolvedType = childType.getJavaProject().findType(resolved[0][0], resolved[0][1]);
-                break LOOP_UNTIL_FIRST_MATCH;
-            }
-        }
-
-        return resolvedType;
-    }
-    
-    /**
-     * Attempts to get a Java IType for a fully qualified signature.  Note that
-     * generic type arguments are generally ignored by JDT when doing such 
-     * look ups.
-     * 
-     * @param javaProject the project context inside which to resolve the type
-     * @param fullyResolvedTypeSignature a fully resolved type signature
-     * @return the IType if resolved, null otherwise
-     */
-    public static IType resolveType(final IJavaProject javaProject, final String fullyResolvedTypeSignature)
-    {
-        final String fullyQualifiedName =
-            getFullyQualifiedName(fullyResolvedTypeSignature);
-        
-        try {
-            return javaProject.findType(fullyQualifiedName);
-        } catch (JavaModelException e) {
-            // accessible problem
-            JSFCommonPlugin.log(e);
-            return null;
-        }
-    }
-    
-    /**
-     * @param type
-     * @param typeParamSignature -- must be a Type Variable Signature
-     * @param typeArguments
-     * @return the signature for the type argument in typeArguments that matches the
-     * named typeParamSignature in type.
-     * @throws IllegalArgumentException if typeParamSignature is not valid
-     * 
-     * For example, given type for java.util.Map, typeParamSignature == "V" and
-     * typeArguments = {Ljava.util.String;, Lcom.test.Blah;}, the result would be
-     * the typeArgument that matches "V", which is "Lcom.test.Blah;}
-     * 
-     * returns null if the match cannot be found.
-     */
-    public static String matchTypeParameterToArgument(final IType type, final String typeParamSignature, final List<String> typeArguments)
-    {
-    	if (Signature.getTypeSignatureKind(typeParamSignature) != Signature.TYPE_VARIABLE_SIGNATURE)
-    	{
-    		throw new IllegalArgumentException();
-    	}
-    	
-        try
-        {
-            ITypeParameter[] typeParams = type.getTypeParameters();
-
-            for (int pos = 0; pos < typeParams.length; pos++)
-            {
-                if (typeParams[pos].getElementName().equals(Signature.getSignatureSimpleName(typeParamSignature)))
-                {
-                    if (pos < typeArguments.size())
-                    {
-                        // TODO: should typeArguments.size ever != typeParams.length?
-                        return typeArguments.get(pos);
-                    }
-                }
-            }
-        } 
-        catch (JavaModelException e) 
-        {
-            JSFCommonPlugin.log(e);
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param type
-     * @param fieldName
-     * @return true if fieldName is a member of type.  Note that if type is java.lang.Enum
-     * then this will always return true since we cannot know what fields the instance has (it could be any enum)
-     */
-    public static boolean isEnumMember(final IType type, final String fieldName)
-    {
-        try
-        {
-            if (type == null || !isEnumType(type))
-            {
-                throw new IllegalArgumentException("type must be non-null and isEnum()==true"); //$NON-NLS-1$
-            }
-            
-            if (fieldName == null)
-            {
-                throw new IllegalArgumentException("fieldName must be non-null"); //$NON-NLS-1$
-            }
-
-            // if type is the java.lang.Enum, always true
-            if (TypeConstants.TYPE_ENUM_BASE.equals(Signature.createTypeSignature(type.getFullyQualifiedName(), true)))
-            {
-                return true;
-            }
-            
-            final IField field = type.getField(fieldName);
-
-            if (field.exists() && field.isEnumConstant())
-            {
-                return true;
-            }
-        }
-        catch (JavaModelException jme)
-        {
-            // fall through and return false
-        }
-        
-        return false;
-    }
-    
-    /**
-     * @param typeSig1 the type signature of the first enum. Must be non-null, fully resolved enum type.
-     * @param typeSig2 the type signature of the second enum.  Must be non-null, fully resolved enum type.
-     * 
-     * @return true if typeSig1.compareTo(typeSig2) is a legal operation (won't throw a CCE)
-     */
-    public static boolean isEnumsCompareCompatible(final String typeSig1, final String typeSig2)
-    {
-        if (typeSig1 == null || typeSig2 == null)
-        {
-            throw new IllegalArgumentException("args must not be null"); //$NON-NLS-1$
-        }
-        
-        if (Signature.getTypeSignatureKind(typeSig1) != Signature.CLASS_TYPE_SIGNATURE
-             || Signature.getTypeSignatureKind(typeSig2) != Signature.CLASS_TYPE_SIGNATURE)
-        {
-            throw new IllegalArgumentException("args must be resolved class types"); //$NON-NLS-1$
-        }
-        
-        // if one or the other is the raw enum type, then they *may* be comparable; we don't know
-        if (TypeConstants.TYPE_ENUM_BASE.equals(typeSig1) 
-                || TypeConstants.TYPE_ENUM_BASE.equals(typeSig2))
-        {
-            return true;
-        }
-        
-        // TODO: support the case of enum base type with generic type argument
-        
-        // only comparable if is the same class
-        return typeSig1.equals(typeSig2);
-    }
-    
-    /**
-     * @param typeSig1 the type signature of the first enum. Must be non-null, fully resolved enum type.
-     * @param typeSig2 the type signature of the second enum. Must be non-null, fully resolved enum type.
-     * @return true if instances typeSig1 and typeSig2 can never be equal due
-     * their being definitively different enum types
-     */
-    public static boolean canNeverBeEqual(final String typeSig1, final String typeSig2)
-    {
-        if (typeSig1 == null || typeSig2 == null)
-        {
-            throw new IllegalArgumentException("args must not be null"); //$NON-NLS-1$
-        }
-        
-        if (Signature.getTypeSignatureKind(typeSig1) != Signature.CLASS_TYPE_SIGNATURE
-             || Signature.getTypeSignatureKind(typeSig2) != Signature.CLASS_TYPE_SIGNATURE)
-        {
-            throw new IllegalArgumentException("args must be resolved class types"); //$NON-NLS-1$
-        }
-
-        // if either one is the base enum type, then we can't be sure
-        if (TypeConstants.TYPE_ENUM_BASE.equals(typeSig1) 
-                || TypeConstants.TYPE_ENUM_BASE.equals(typeSig2))
-        {
-            return false;
-        }
-
-        // if they are definitely not the same enum types, then their values
-        // can never be equal
-        return !typeSig1.equals(typeSig2);
-    }
-    
-
-    /**
-     * NOTE: we diverge from IType.isEnum() because we also return true if the base type
-     * is a java.lang.Enum since we consider this to be "any enumeration type" whereas JDT considers
-     * it merely a class since it doesn't use an "enum" keyword declaration.
-     * @param type
-     * @return true if type is an enum type or is java.lang.Enum
-     */
-    static boolean isEnumType(IType type)
-    {
-        if (type == null)
-        {
-            return false;
-        }
-        
-        // check if it's the enumeration base type
-        if (TypeConstants.TYPE_ENUM_BASE.equals(Signature.createTypeSignature(type.getFullyQualifiedName(), true)))
-        {
-            return true;
-        }
-    
-        try
-        {
-            return type.isEnum();
-        }
-        catch (JavaModelException jme)
-        {
-            // log and fallthrough to return false
-            JSFCommonPlugin.log(jme, "Problem resolving isEnum"); //$NON-NLS-1$
-        }
-        
-        // if unresolved assume false
-        return false;
-    }
-    
-    private TypeUtil()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/package-info.java
deleted file mode 100644
index 239a125..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/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
- *    
- ********************************************************************************/
-
-/**
- * Common utility classes.  
- */
-package org.eclipse.jst.jsf.common.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java
deleted file mode 100644
index 506ee47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java
+++ /dev/null
@@ -1,267 +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.contentmodel.annotation;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationFileRegistry;
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationMap;
-
-/**
- * Class meant for all public access to the design-time meta-data (CMAnnotations) values.
- * 
- * <li>Annotation files are registered against a uri (eg. http://java.sun.com/jsf/core) 
- * using the extension-point <code>org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles</code>.</li>
- * <li>Any number of annotation files can be associated with the uri and against any element or attribute.</li>
- * <li>It is recommended that a single plugin should avoid registering meta-data for the same attribute or element 
- * from different annotationFiles.</li>
- * <li>A CMAnnotation allows for a collection of property values for a named property.</li>  
- * <li>Querying the registry using this helper class can return lists of <code>CMAnnotationPropertyValue</code> 
- * which allows the caller to make the determination of whether the property value is of interest or not.</li> 
- * <li>The caller can also query the registry for specific plugin supplied annotation meta-data.</li>
- * 
- * <li>-- include link to doc--</li>
- * 
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMElementAnnotation
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAttributeAnnotation
- * @see CMAnnotationPropertyValue
- * 
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public class CMAnnotationHelper {
-	private static List EMPTY_LIST = new ArrayList(0);
-	
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag/tag attribute combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Will return empty if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMAttributeProperties(String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
-		return getCMAttributeProperties(null, uri, cmElementName, cmAttrName, meta_prop_name);
-	}
-	
-
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given bundleId, property name and uri/tag/tag attribute combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
-	 * 
-	 * Will return empty if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMAttributeProperties(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
-		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
-			return EMPTY_LIST;
-		
-		List list = new ArrayList();
-		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
-		if (maps != null){
-			Iterator it = maps.iterator();
-			while (it.hasNext()){
-				CMAnnotationMap map = (CMAnnotationMap)it.next();
-				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
-					CMAnnotationPropertyValue propVal =  map.getCMAttributePropertyValue(cmElementName, cmAttrName, meta_prop_name);
-					if (propVal != null){
-						list.add(propVal);
-					}
-				}
-			}
-		}
-		return list;
-	}
-	
-	/**
-	 * Convenience method to return the first string value for a given bundle, uri, element, attr, and meta_prop_name.
-	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
-	 * should probably be called.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return null if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return property value as String
-	 */
-	public static String getCMAttributePropertyValue(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
-		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
-		}
-		return null;
-	}
-	
-	/**
-	 * Convenience method to return the list of property values for a given bundle, uri, element, attr, and meta_prop_name.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return property values as List
-	 */
-	public static List getCMAttributePropertyValues(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
-		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
-		if (!vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
-		}
-		return EMPTY_LIST;
-	}
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag element combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMElementProperties(String uri, String cmElementName, String meta_prop_name) {
-		return getCMElementProperties(null, uri, cmElementName, meta_prop_name);
-	}
-
-	
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given bundle, property name and uri/tag element combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMElementProperties(String bundleId, String uri, String cmElementName, String meta_prop_name) {
-		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
-			return EMPTY_LIST;
-		
-		List list = new ArrayList();
-		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
-		if (maps != null){
-			Iterator it = maps.iterator();
-			while (it.hasNext()){
-				CMAnnotationMap map = (CMAnnotationMap)it.next();
-				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
-					CMAnnotationPropertyValue propVal =  map.getCMElementPropertyValue(cmElementName, meta_prop_name);
-					if (propVal != null){
-						list.add(propVal);
-					}
-				}
-			}
-		}
-		return list;
-	}
-	
-	/**
-	 * Convenience method to return the first string value for a given bundle, uri, element, and meta_prop_name.
-	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
-	 * should probably be called.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return null if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return property value as String
-	 */
-	public static String getCMElementPropertyValue(String bundleId, String uri, String cmElementName, String meta_prop_name){
-		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
-		}
-		return null;
-	}
-	
-	/**
-	 * Convenience method to return the list of property values for a given bundle, uri, element, and meta_prop_name.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return List of property values as Strings 
-	 */
-	public static List getCMElementPropertyValues(String bundleId, String uri, String cmElementName, String meta_prop_name){
-		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
-		}
-		return null;
-	}
-	
-	/**
-	 * Return whether or not there are annotation files for a given uri and bundleId.
-	 * @param bundleId
-	 * @param uri
-	 * @return boolean
-	 */
-	public static boolean hasAnnotations(String bundleId, String uri) {
-		return CMAnnotationFileRegistry.getInstance().hasAnnotations(bundleId, uri);
-	}
-	
-	/**
-	 * Return whether or not there are annotation files for a given uri.
-	 * @param uri
-	 * @return boolean 
-	 */
-	public static boolean hasAnnotations(String uri) {
-		return CMAnnotationFileRegistry.getInstance().hasAnnotations(uri);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java
deleted file mode 100644
index 4147572..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java
+++ /dev/null
@@ -1,69 +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.contentmodel.annotation;
-
-import java.util.List;
-
-/**
- * The class used to return result of a query on the annotation model.   
- * 
- * @author Gerry Kessler - Oracle
- *
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public class CMAnnotationPropertyValue {
-	private ICMAnnotationSourceFileInfo fileInfo;
-	private List propertyValues;
-	
-	/**
-	 * Constructor
-	 * @param fileInfo
-	 * @param propertyValues
-	 */
-	public CMAnnotationPropertyValue(ICMAnnotationSourceFileInfo fileInfo, List propertyValues){
-		this.fileInfo = fileInfo;
-		this.propertyValues = propertyValues;
-	}
-
-	/**
-	 * Convenience method for accessing the bundleid
-	 * @return String
-	 */
-	public String getBundleId(){
-		return fileInfo.getBundleId();
-	}
-	
-	/**
-	 * @return ICMAnnotationSourceFileInfo used to define this property
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	
-	/**
-	 * Return first string property value.   
-	 * If caller expects more values, they should use getPropertyValues().
-	 * @return String  
-	 */
-	public String getPropertyValue(){
-		return ((String)propertyValues.get(0)).trim();
-	}
-	
-	/**
-	 * Return list of property values as strings for the given property
-	 * @return java.util.List
-	 */
-	public List getPropertyValues(){
-		return propertyValues;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.java
deleted file mode 100644
index 71abc4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.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:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-
-/**
- * Used to supply an InputStream to the parser of an annotation 
- * meta-data file and the URL to the resource bundle for a properties file, if any.
- * 
- * Implementors must provide a zero-argument constructor.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */ 
-public abstract class CMAnnotationSourceFileLocator{
-	/**
-	 * ICMAnnotationSourceFileInfo
-	 */
-	protected ICMAnnotationSourceFileInfo fileInfo;
-	
-	/**
-	 * Set the ICMAnnotationSourceFileInfo for locator
-	 * @param fileInfo
-	 */
-	public final void setFileInfo(ICMAnnotationSourceFileInfo fileInfo){
-		this.fileInfo = fileInfo;
-	}
-	
-	/**
-	 * @return ICMAnnotationSourceFileInfo for the locator
-	 */
-	protected final ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	/**
-	 * Return InputStream to the meta-data annotation.  
-	 * Callers are responsble for closing the stream.
-	 * @return InputStream
-	 * @throws IOException
-	 */
-	public abstract InputStream getAnnotationSourceInputStream() throws IOException;
-	/**
-	 * Return ResourceBundle for the property files if there are any.  Return null if not.
-	 * 
-	 * @return java.util.ResourceBundle
-	 * @throws IOException
-	 * @throws MissingResourceException
-	 */
-	public abstract ResourceBundle getResourceBundle() throws IOException, MissingResourceException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java
deleted file mode 100644
index ebf214f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java
+++ /dev/null
@@ -1,42 +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.contentmodel.annotation;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor;
-
-/**
- * Interface used to allow parsing of meta-data files that do not conform to the default schema provided.
- *  
- * @author Gerry Kessler - Oracle
- * 
- * also see ext-pt: org.eclipse.jst.jsf.contentmodel.annotations.annotationFile  
- * also see xml schema defn: <code>http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema</code>
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor
- * @see org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public interface ICMAnnotationFileParser {
-
-	/**
-	 * Parse the annotation file using the InputStream provided by the locator and   
-	 * using the ICMAnnotationAdvisor methods to fill the internal model.
-	 * 
-	 * The implementor is responsible for closing the inputstream when parse is complete.
-	 * 
-	 * @param advisor 
-	 * @param locator 
-	 * 
-	 * @throws Exception
-	 */
-	public void parse(ICMAnnotationAdvisor advisor, CMAnnotationSourceFileLocator locator) throws Exception;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.java
deleted file mode 100644
index 8b9ca6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.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:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-/**
- * The interface used to access information about the annotationFile extension
- * 
- * Not intended to be implemented by clients.
- * @author Gerry Kessler - Oracle
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public interface ICMAnnotationSourceFileInfo {
-	/**
-	 * @return location of annotation file that the locator class will use 
-	 */
-	public String getAnnotationFileLocation();
-	/**
-	 * @return bundle id of plugin defining the annotation file
-	 */
-	public String getBundleId();
-	/**
-	 * @return class name of parser to use on the annotation file
-	 */
-	public String getParserClassName();
-	/**
-	 * @return class name of the file locator
-	 */
-	public String getAnnotationFileLocatorClassname();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java
deleted file mode 100644
index 5fa5d3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- * 
- * 
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-
-/**
- * Content model annotation.   A property with a set of values.
- * @deprecated see common.metadata package
- */
-public abstract class CMAnnotation {
-	private String _name;	
-	private Hashtable props = new Hashtable(3);
-
-	/**
-	 * @param name
-	 */
-	public CMAnnotation(String name) {
-		setName(name.trim());
-	}
-
-	private void setName(String name) {
-		_name = name;
-	}
-
-	/**
-	 * @return the name
-	 */
-	public String getName() {
-		return _name;
-	}
-
-	/**
-	 * @param propertyName
-	 * @param propertyValue
-	 */
-	public void setProperty(String propertyName, String propertyValue) {
-		CMAnnotationProperty prop = getAnnotationProperty(propertyName);
-		if (prop == null){
-			prop = new CMAnnotationProperty(propertyName, propertyValue);
-			props.put(propertyName, prop);
-		}
-		else {
-			prop.setValue(propertyValue);
-		}		
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the annotation property
-	 */
-	public CMAnnotationProperty getAnnotationProperty(String propertyName){
-		if (props.containsKey(propertyName))
-			return (CMAnnotationProperty)props.get(propertyName);
-		return null;
-	}
-	
-	class CMAnnotationProperty {
-		private String propName;
-		private List propValues = new ArrayList(2);
-		
-		/**
-		 * @param propertyName
-		 */
-		public CMAnnotationProperty(String propertyName){
-			propName = propertyName;
-		}
-
-		/**
-		 * @param propertyName
-		 * @param propertyValue
-		 */
-		public CMAnnotationProperty(String propertyName, String propertyValue){
-			propName = propertyName;
-			propValues.add(propertyValue);
-		}
-		
-		/**
-		 * @param propertyValue
-		 */
-		public void setValue(String propertyValue) {
-			propValues.add(propertyValue);
-		}
-		
-		/**
-		 * @return the property name
-		 */
-		public String getPropertyName(){
-			return propName;
-		}
-		
-		/**
-		 * @return the property value
-		 */
-		public List getPropertyValues(){
-			return propValues;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java
deleted file mode 100644
index 87359c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java
+++ /dev/null
@@ -1,98 +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.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-/**
- * An internal class implementing ICMAnnotationAdvisor that allows us to decouple the parser
- * from the internal data model (CMAnnotationMap).
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationAdvisor implements ICMAnnotationAdvisor {
-
-	private CMAnnotationMap map;
-
-	/**
-	 * @param map
-	 */
-	public CMAnnotationAdvisor(CMAnnotationMap map) {
-		this.map = map;
-		setCaseSensitive(true);// default to case sensitive
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#addElementAnnotation(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void addElementAnnotation(String elementName, String propertyName, String propertyValue) {
-
-		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
-		elem.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#addAttributeAnnotation(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void addAttributeAnnotation(String elementName, String attributeName,
-			String propertyName, String propertyValue) {
-
-		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
-		CMAttributeAnnotation attr = getAttributeAnnotation(elem,
-				getStringValueForCaseSensitivity(attributeName));
-		attr.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#getFileInfo()
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo() {
-		return this.map.getFileInfo();
-	}
-
-	/**
-	 * This implementation is case sensitive by default
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#setCaseSensitive(boolean)
-	 */
-	public void setCaseSensitive(boolean val) {
-		map.setCaseSensitive(val);
-	}
-
-	private CMElementAnnotation getElementAnnotation(String elementName) {
-		CMElementAnnotation elem = map.getElementAnnotation(elementName);
-		if (elem == null) {
-			elem = new CMElementAnnotation(elementName);
-			map.addCMElementAnnotation(elem);
-		}
-		return elem;
-	}
-
-	private CMAttributeAnnotation getAttributeAnnotation(CMElementAnnotation elem,
-			String attributeName) {
-		// attrAnnotations map will always be initialized so do not need to check for null
-		CMAttributeAnnotation attr = (CMAttributeAnnotation) elem.getAttributeAnnotations().get(
-				attributeName);
-		if (attr == null) {
-			attr = new CMAttributeAnnotation(elem.getName(), attributeName);
-			elem.addCMAttributeAnnotation(attr);
-		}
-		return attr;
-	}
-
-	private String getStringValueForCaseSensitivity(String val) {
-		return map.getStringValueForCaseSensitivity(val);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java
deleted file mode 100644
index 8388dac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- * 
- * 
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-/**
- * Contains information about annotation files.  
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationFileInfo implements ICMAnnotationSourceFileInfo{
-	private String annotationFileLocation;
-	private String annotationFileLocatorClassname;
-	private String bundleId;
-	private String parserClassname;
-
-	/**
-	 * @param annotationFileLocation
-	 * @param bundleId
-	 * @param parserClassname
-	 * @param annotationFileLocatorClassname
-	 */
-	public CMAnnotationFileInfo(String annotationFileLocation, String bundleId, String parserClassname, String annotationFileLocatorClassname) {
-		this.annotationFileLocation = annotationFileLocation.trim();
-		this.bundleId = bundleId.trim();
-		this.parserClassname = parserClassname;
-		this.annotationFileLocatorClassname = annotationFileLocatorClassname;
-	}
-
-	/**
-	 * Get the location of the annotation file as originally specified.
-	 * 
-	 * @return String
-	 */
-	public String getAnnotationFileLocation() {
-		return annotationFileLocation;
-	}
-	
-	/**
-	 * Get the annotation file locator classname that must implement ICMAnnotationSourceFileLocator.
-	 * Can return null or empty string.   Caller should provide default.
-	 * 
-	 * @return String
-	 */
-	public String getAnnotationFileLocatorClassname() {
-		return annotationFileLocatorClassname != null ? annotationFileLocatorClassname.trim() : null;
-	}
-
-	/**
-	 * Get the bundle id of the plugin where the annotation file is located.
-	 * 
-	 * @return String
-	 */
-	public String getBundleId() {
-		return bundleId;
-	}
-	
-	/**
-	 * Return classname for the annotation file parser (ICMAnnotationFileParser) to use.
-	 * Can return null or empty string.   If it does, the caller should provide a default.
-	 * 
-	 * @return String
-	 */
-	public String getParserClassName(){
-		return parserClassname != null ? parserClassname.trim() : null;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java
deleted file mode 100644
index 81369d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Default implementation of ICMAnnotationFileParser that will parse xml files conforming to 
- * http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema.   
- * 
- * @author Gerry Kessler - Oracle
- * 
- * also see http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileParser implements ICMAnnotationFileParser {
-	
-	private static final String TAG_ID_ANNOTATIONS = "grammar-annotations"; //$NON-NLS-1$
-	private static final String TAG_ID_ELEMENT = "cm-element"; //$NON-NLS-1$
-	private static final String TAG_ID_ATTRIBUTE = "cm-attribute"; //$NON-NLS-1$
-	private static final String TAG_ID_PROPERTY = "property"; //$NON-NLS-1$
-	private static final String TAG_ID_PROPERTY_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * This method is called to parse an annotation file and store the contents
-	 * into an annotationMap via the advisor
-	 */
-	private void parse(ICMAnnotationAdvisor advisor, InputStream input) throws Exception {
-		ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
-		try {
-			SAXParserFactory factory = SAXParserFactory.newInstance();
-			factory.setNamespaceAware(true);
-			SAXParser parser = factory.newSAXParser();
-			parser.parse(new InputSource(input), new CMAnnotationMapContentHandler(advisor));
-		} finally {
-			Thread.currentThread().setContextClassLoader(prevClassLoader);
-			if (input != null){
-				try {
-					input.close();
-				} catch (IOException e) {
-                    JSFCommonPlugin.log(e, "error closing annotation file");
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser#parse(org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor, org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator)
-	 */
-	public void parse(ICMAnnotationAdvisor advisor, CMAnnotationSourceFileLocator locator)
-			throws Exception {
-		
-		InputStream inputStream = locator.getAnnotationSourceInputStream();
-		parse(advisor, inputStream);
-	}
-
-	/**
-	 * Default content handler for annotation files following grammar-annotations schema
-	 * 
-	 * @author Gerry Kessler - Oracle
-	 */
-	protected class CMAnnotationMapContentHandler extends DefaultHandler {
-		private ICMAnnotationAdvisor advisor;
-		private String elementName;
-		private String attributeName;
-		private String currentPropertyName;
-		private String currentPropertyValue;
-		private StringBuffer propertyValueBuffer;
-
-		private boolean isInCMAttribute = false;
-
-		private boolean doCaptureNodeText;
-
-		/**
-		 * Constructor
-		 * @param advisor
-		 */
-		public CMAnnotationMapContentHandler(ICMAnnotationAdvisor advisor) {
-			this.advisor = advisor;
-		}
-
-		public void startElement(String uri, String localName, String qName, Attributes attributes)
-				throws SAXException {
-			if (localName.equals(TAG_ID_ANNOTATIONS)) {
-				int attributesLength = attributes.getLength();
-				for (int i = 0; i < attributesLength; i++) {
-					String attributeName_ = attributes.getLocalName(i);
-					String attributeValue = attributes.getValue(i);
-					if (attributeName_.equals("caseSensitive")) { //$NON-NLS-1$					
-						if (attributeValue.trim().equals("false")) {//$NON-NLS-1$
-							advisor.setCaseSensitive(false);
-						}
-					}
-				}
-			} else if (localName.equals(TAG_ID_ELEMENT)) {
-				isInCMAttribute = false;
-				elementName = attributes.getValue("name"); //$NON-NLS-1$
-			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
-				isInCMAttribute = true;
-				attributeName = attributes.getValue("name"); //$NON-NLS-1$
-			} else if (localName.equals(TAG_ID_PROPERTY)) {
-				currentPropertyName = attributes.getValue("name"); //$NON-NLS-1$					
-			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				propertyValueBuffer = new StringBuffer();
-				doCaptureNodeText = true;
-			}
-		}
-
-		public void endElement(String uri, String localName, String qName) throws SAXException {
-			if (currentPropertyName != null && localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				doCaptureNodeText = false;
-				currentPropertyValue = propertyValueBuffer.toString();
-				if (currentPropertyValue != null) {					
-					if (isInCMAttribute)
-						advisor.addAttributeAnnotation(elementName, attributeName,
-								currentPropertyName, currentPropertyValue);
-					else
-						advisor.addElementAnnotation(elementName, currentPropertyName,
-								currentPropertyValue);
-				}
-			}
-
-			if (localName.equals(TAG_ID_ELEMENT)) {
-				elementName = null;
-			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
-				isInCMAttribute = false;
-				attributeName = null;
-			} else if (localName.equals(TAG_ID_PROPERTY)) {
-				currentPropertyName = null;
-			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				currentPropertyValue = null;
-			}
-		}
-
-		public void characters(char[] ch, int start, int length) {
-			if (doCaptureNodeText)
-				propertyValueBuffer.append(ch, start, length);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java
deleted file mode 100644
index 6736001..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java
+++ /dev/null
@@ -1,111 +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.contentmodel.annotation.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * Helper class used by the annotations registry to parse and poplulate the annotation maps using
- * the specified parsed, and source file locator from the extension.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileParserHelper {
-	private static final String DEFAULT_PARSER_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationFileParser"; //$NON-NLS-1$
-	private static final String DEFAULT_LOCATOR_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.CMPluginRelativeSourceFileLocator"; //$NON-NLS-1$
-	
-	/**
-	 * default constructor
-	 */
-	public CMAnnotationFileParserHelper() {
-		super();
-	}
-	
-	/**
-	 * @param map
-	 */
-	public void parse(CMAnnotationMap map){
-		ICMAnnotationFileParser parser = getParser(map.getFileInfo());
-		ICMAnnotationAdvisor advisor = new CMAnnotationAdvisor(map);
-		CMAnnotationSourceFileLocator locator = getLocator(map.getFileInfo());
-		map.setLocator(locator);
-		try {
-			parser.parse(advisor, locator);
-		} catch (Exception e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_unable_to_parse , new String[]{map.getFileInfo().getAnnotationFileLocation(), map.getFileInfo().getAnnotationFileLocatorClassname()}));
-		}
-	}
-
-	private ICMAnnotationFileParser getParser(ICMAnnotationSourceFileInfo fileInfo) {
-		String parserClassName = fileInfo.getParserClassName();
-		Object obj = null;
-		if (parserClassName != null && !parserClassName.equals("")){ //$NON-NLS-1$
-			obj = getObjectForClassname(fileInfo.getBundleId(), parserClassName);
-		}
-		else {//return default			
-			obj = getObjectForClassname(JSFCommonPlugin.PLUGIN_ID, DEFAULT_PARSER_NAME );
-		}
-		if (obj != null && obj instanceof ICMAnnotationFileParser)
-			return (ICMAnnotationFileParser)obj;
-		
-		return null;
-	}
-	
-	private CMAnnotationSourceFileLocator getLocator(ICMAnnotationSourceFileInfo fileInfo) {
-		String locatorClassName = fileInfo.getAnnotationFileLocatorClassname();
-		Object obj = null;
-		if (locatorClassName != null && !locatorClassName.equals("")){ //$NON-NLS-1$
-			obj = getObjectForClassname(fileInfo.getBundleId(), locatorClassName);
-		}
-		else {//return default			
-			obj = getObjectForClassname(JSFCommonPlugin.PLUGIN_ID, DEFAULT_LOCATOR_NAME);
-		}
-		if (obj != null && obj instanceof CMAnnotationSourceFileLocator){
-			CMAnnotationSourceFileLocator locator = (CMAnnotationSourceFileLocator)obj;
-			locator.setFileInfo(fileInfo);
-			return locator;
-		}
-		return null;
-	}
-	
-	private static Object getObjectForClassname(String bundleId, String providerClassName){
-		try {
-			Bundle bundle =Platform.getBundle(bundleId);
-			if (bundle == null){
-				JSFCommonPlugin.log(IStatus.ERROR, NLS.bind(Messages.CMAnnotationFileParserHelper_unable_to_find_bundleid, new String[]{bundleId, providerClassName}));
-				return null;
-			}
-			Class klass = bundle.loadClass(providerClassName);
-			if (klass != null){
-				return klass.newInstance();					
-			}
-			return null;
-		} catch (ClassNotFoundException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_class_not_found, new String[]{bundleId, providerClassName}));
-		} catch (InstantiationException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_instantiation_exception, new String[]{bundleId, providerClassName}));
-		} catch (IllegalAccessException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_illegal_access_exception, new String[]{bundleId, providerClassName}));
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java
deleted file mode 100644
index 58d8ed6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-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.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This internal class is used to associate one or more annotation files with a grammar
- * file mapped by a key (uri).
- * 
- * Using the CMAnnotationFileRegistryReader, extenders of <code>org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles</code> are loaded
- * into the annotationFilesMap keyed by uri.   There can be multiple annotationFiles mapped to the same uri.
- * 
- * This registry should only be accessed by clients using the <code>org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationHelper</code>.
- * Only when the system attempts to access an annotation for a content model, will the file be parsed and cached.
- * 
- * When queried, CMAnnotationPropertyValue objects are returned for each named property found in each annotation file for a particular uri.
- * 
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * @see CMAnnotationFileRegistryReader
- * @see CMAnnotationMap
- * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
- * 
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationFileRegistry {
-	//all annotation files registered using "org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles" ext-pt. and keyed by uri.  
-	private Map annotationFilesMap 	= new HashMap(1);
-	//will return list of CMAnnotationMap (parsed annotation files) objects keyed by uri
-	private Map parsedFilesMap 		= new HashMap(1);
-
-	private static CMAnnotationFileRegistry reg;
-	
-	private static final boolean DISABLED = true;
-	
-	/**
-	 * @return return the singleton instance of the registry
-	 */
-	public static CMAnnotationFileRegistry getInstance() {
-		if (reg == null){
-			reg = new CMAnnotationFileRegistry();
-		}
-		return reg;
-		
-	}
-	
-	//constructor reads the annotationFile registry and populates the annotationFilesMap
-	private CMAnnotationFileRegistry() {
-		if (!(DISABLED))
-			new CMAnnotationFileRegistryReader(this).readRegistry();
-	}
-	
-	private synchronized List getAnnotationFilesInfos(String uri) {
-		List theList = (List) annotationFilesMap.get(uri);
-		return theList != null ? theList : new ArrayList();
-	}
-		
-	/**
-	 * For use by registry reader only
-	 * @param uri
-	 * @param fileInfo 
-	 */
-	public synchronized void addAnnotationFileInfo(String uri, ICMAnnotationSourceFileInfo fileInfo) {
-		List fileInfos = (List) annotationFilesMap.get(uri);
-		if (fileInfos == null) {
-			fileInfos = new ArrayList();
-			annotationFilesMap.put(uri, fileInfos);
-		}
-		fileInfos.add(fileInfo);
-	}	
-	
-	private synchronized void addParsedFileToMap(String uri, CMAnnotationMap map) {
-		List maps = (List) parsedFilesMap.get(uri);
-		if (maps == null) {
-			maps = new ArrayList();
-			parsedFilesMap.put(uri, maps);
-		}
-		maps.add(map);
-	}
-
-	/**
-	 * Return list of CMAnnotationMaps for a given uri.  
-	 * By calling this method, unparsed annotation files for the given 
-	 * uri will be parsed.
-	 * 
-	 * @param uri
-	 * @return List of CMAnnotationMaps
-	 */
-	public synchronized List getAnnotationMaps(String uri) {
-		if (DISABLED){
-			JSFCommonPlugin.log(IStatus.ERROR, "Attempted metadata access using CMAnnotationFiles for uri: "+uri+".   Use org.eclipse.jst.jsf.common.metadata, instead." );
-			return Collections.EMPTY_LIST;
-		}
-		
-		List list = (List)parsedFilesMap.get(uri);
-		if (list == null){
-			loadAnnotationsForGrammar(uri);
-			list = (List)parsedFilesMap.get(uri);
-		}
-		return list;
-	}
-	
-
-	/**
-	 * Does this bundle define an annotationFile extension for the given uri.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @return boolean
-	 */
-	public boolean hasAnnotations(String bundleId, String uri) {
-//		if (DISABLED){
-//			
-//		}
-		List maps = (List)annotationFilesMap.get(uri);
-		if (maps == null || maps.size() ==0)
-			return false;
-		
-		for (int i=0;i<maps.size();i++){
-			if (((ICMAnnotationSourceFileInfo)maps.get(i)).getBundleId().equals(bundleId))
-				return true;
-		}
-		return false;
-	}
-	/**
-	 * Are there any annotationFile extensions defined for the given uri.
-	 * @param uri
-	 * @return boolean
-	 */
-	public boolean hasAnnotations(String uri){
-		if (DISABLED){
-			JSFCommonPlugin.log(IStatus.ERROR, "Attempted metadata access using CMAnnotationFiles for uri: "+uri+".   Use org.eclipse.jst.jsf.common.metadata, instead." );
-			return false;
-		}
-		if (annotationFilesMap.get(uri) != null)
-			return true;
-		return false;
-	}
-
-	private boolean areAnnotationsParsed(String uri) {
-		if (hasAnnotations(uri)){
-			if (parsedFilesMap.get(uri) != null)
-				return true;
-		}
-		return false;
-	}
-	
-	private void loadAnnotationsForGrammar(String uri) {
-		if (areAnnotationsParsed(uri))
-			return;
-		
-		if (DISABLED)
-			return;
-		
-		List annotationFiles = getAnnotationFilesInfos(uri);
-		for (Iterator i = annotationFiles.iterator(); i.hasNext();) {
-			try {					
-				CMAnnotationFileInfo annotationFileInfo = (CMAnnotationFileInfo) i.next();
-				CMAnnotationMap map = new CMAnnotationMap(annotationFileInfo);
-				CMAnnotationFileParserHelper parserHelper = new CMAnnotationFileParserHelper();
-				parserHelper.parse(map);
-				addParsedFileToMap(uri, map);
-			}
-			catch (Exception e) {
-                JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileRegistry_load_error, new String[]{uri}));				
-			}
-		}		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java
deleted file mode 100644
index ce5bcc0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * This class reads the Activator manifests and adds each specified grammar
- * annotation file to the CMAnnotationsRegistry.
- * 
- * @see CMAnnotationFileRegistry
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileRegistryReader {
-	private static final String EXTENSION_POINT_ID = "annotationFiles"; //$NON-NLS-1$
-	private static final String TAG_NAME = "annotationFile"; //$NON-NLS-1$
-	private static final String ATT_URI = "uri"; //$NON-NLS-1$
-	private static final String ATT_LOCATION = "location"; //$NON-NLS-1$
-	private static final String ATT_LOCATOR = "locator"; //$NON-NLS-1$
-	private static final String ATT_PARSER = "parser"; //$NON-NLS-1$
-
-	private CMAnnotationFileRegistry annotationFileRegistry;
-
-	/**
-	 * @param annotationFileRegistry
-	 */
-	public CMAnnotationFileRegistryReader(CMAnnotationFileRegistry annotationFileRegistry) {
-		this.annotationFileRegistry = annotationFileRegistry;
-	}
-
-	/**
-	 * read the registery
-	 */
-	public void readRegistry() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				readElement(elements[i]);
-			}
-		}
-	}
-
-	private void readElement(IConfigurationElement element) {
-		if (element.getName().equals(TAG_NAME)) {
-			String uri = element.getAttribute(ATT_URI);
-			String location = element.getAttribute(ATT_LOCATION);
-			String locator = element.getAttribute(ATT_LOCATOR);
-			String parser = element.getAttribute(ATT_PARSER);
-			String bundleId = null;
-			if (uri != null && location != null) {
-				try {
-					bundleId = element.getContributor().getName();
-					CMAnnotationFileInfo fileInfo = new CMAnnotationFileInfo(location, bundleId, parser, locator);
-					annotationFileRegistry.addAnnotationFileInfo(uri, fileInfo);
-				}
-				catch (Exception e) {
-					JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileRegistryReader_problem, new String[]{bundleId, uri, location})); 
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java
deleted file mode 100644
index 47d258f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationPropertyValue;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Internal data model of content model annotations.   
- * The content model is assumed to be xml-based (elements and attributes).
- * 
- * Map of annotations for content model elements keyed by tag element name.
- * Attribute annotations are stored in a map inside the element annotation.
- * 
- *  @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMElementAnnotation
- *  @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAttributeAnnotation
- * 
- * @deprecated see common.metadata package
- */
-public class CMAnnotationMap {
-	/**
-	 * map of tag-element annotations keyed by tag name
-	 */
-	protected Map cmNodeToAnnotationMap = new Hashtable();
-	private boolean isCaseSensitive = true;
-	private ICMAnnotationSourceFileInfo fileInfo;
-	private ResourceBundle resourceBundle;
-	private CMAnnotationSourceFileLocator locator;
-
-	/**
-	 * Constructor
-	 * @param fileInfo 
-	 */
-	public CMAnnotationMap(ICMAnnotationSourceFileInfo fileInfo) {
-		this.fileInfo = fileInfo;
-	}
-
-	/**
-	 * Set whether or not the model should be queried in a case sensitive manner
-	 * @param isCaseSensitive 
-	 */
-	public void setCaseSensitive(boolean isCaseSensitive) {
-		this.isCaseSensitive = isCaseSensitive;
-	}
-
-	/**
-	 * Set the ICMAnnotationSourceFileLocator used to find and load the annotation file
-	 * @param locator
-	 */
-	public void setLocator(CMAnnotationSourceFileLocator locator){
-		this.locator = locator;
-	}
-	
-	/**
-	 * Return  the annotation for the specified element name.
-	 * Will be null if no annotation is found.
-	 * 
-	 * @param elementName
-	 * @return CMElementAnnotation
-	 */
-	public CMElementAnnotation getElementAnnotation(String elementName) {
-		CMElementAnnotation elem = null;
-		if (cmNodeToAnnotationMap.containsKey(elementName)){
-			List annos = (List)cmNodeToAnnotationMap.get(elementName);
-			Iterator it = annos.iterator();
-			while(it.hasNext()){
-				elem = (CMElementAnnotation)it.next();
-				if (elem.getName() == elementName)
-					break;
-			}
-		}		
-		return elem;
-	}
-	
-	/**
-	 * Annotation advisor will call this method when adding an annotation to a map.
-	 * 
-	 * @param annotation
-	 */
-	public void addCMElementAnnotation(CMElementAnnotation annotation) {
-		addAnnotationForCMNodeName(annotation.getName(), annotation);
-	}
-
-	private void addAnnotationForCMNodeName(String cmNodeName, CMElementAnnotation annotation) {
-		List list = (List) cmNodeToAnnotationMap.get(cmNodeName);
-		if (list == null) {
-			list = new Vector();
-			cmNodeToAnnotationMap.put(cmNodeName, list);
-		}
-		list.add(annotation);
-	}
-
-	/**
-	 * Returns list of NLS fixed String values for a given property name of an element.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return List of Strings - can be null
-	 */
-	public List getCMElementPropertyValues(String elementName, String propertyName) {
-		List result = null;
-		String key = getStringValueForCaseSensitivity(elementName);
-		String propName = getStringValueForCaseSensitivity(propertyName);
-		List annotationList = (List) cmNodeToAnnotationMap.get(key);
-		if (annotationList != null) {
-			for (Iterator i = annotationList.iterator(); i.hasNext();) {
-				CMAnnotation annotation = (CMAnnotation) i.next();
-				if (annotation.getAnnotationProperty(propName)!= null) {
-					result = getNLSPropertyValues(annotation, propName);
-					break;
-				}
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 * Returns the first NLS fixed String value for a given property name of an element.
-	 * Caller should use <code>getCMElementPropertyValues</code> if multiple values can be returned for a
-	 * property name.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return String - can be null
-	 */
-	public String getCMElementProperty(String elementName, String propertyName) {
-		String result = null;
-		List vals = getCMElementPropertyValues(elementName, propertyName);
-		if (vals != null){
-			if (vals.get(0) != null)
-				result = vals.get(0).toString();
-		}
-		return result;
-	}
-	
-	/**
-	 * Returns list of NLS fixed String values for a given property name of an attribute of a particular element.
-	 * 
-	 * @param elementName
-	 * @param attributeName 
-	 * @param propertyName
-	 * @return List of Strings - can be null
-	 */
-	public List getCMAttributePropertyValues(String elementName, String attributeName, String propertyName) {
-		
-		List result = null;
-		String key = getStringValueForCaseSensitivity(elementName);
-		String attrName = getStringValueForCaseSensitivity(attributeName);
-		String propName = getStringValueForCaseSensitivity(propertyName);		
-		List annotationListForElement = (List) cmNodeToAnnotationMap.get(key);
-		if (annotationListForElement != null) {
-			CMAttributeAnnotation annotationForAttr = getCMAttributeAnnotation(annotationListForElement, attrName);
-			if (annotationForAttr != null){
-				if (annotationForAttr.getAnnotationProperty(propName) != null){
-					List propVals = getNLSPropertyValues(annotationForAttr, propName);
-					if (propVals != null)
-						result = propVals;
-				}
-			}
-		}
-		return result;
-	}
-		
-	/**
-	 * Gets the first property value for the specified element and attribute.
-	 * 
-	 * @param elementName
-	 * @param attributeName
-	 * @param propertyName
-	 * @return String - can be null
-	 */
-	public String getCMAttributeProperty(String elementName, String attributeName, String propertyName) {
-		String result = null;
-		List propVals = getCMAttributePropertyValues(elementName, attributeName, propertyName);
-		if (propVals != null){
-			result = (String)propVals.get(0);
-		}
-		return result;
-	}
-
-	/**
-	 * Return a <code>CMAnnotationPropertyValue</code> object for the given element, attribute, and property name.
-	 * 
-	 * @param elementName
-	 * @param attributeName
-	 * @param propertyName
-	 * @return CMAnnotationPropertyValue - can be null
-	 */
-	public CMAnnotationPropertyValue getCMAttributePropertyValue(String elementName, String attributeName, String propertyName) {
-		CMAnnotationPropertyValue result = null;
-		List val = getCMAttributePropertyValues(elementName, attributeName, propertyName);
-		if (val != null){
-			result = new CMAnnotationPropertyValue(fileInfo, val);
-		}
-		return result;
-	}
-	
-	/**
-	 * Return a <code>CMAnnotationPropertyValue</code> object for the given element and property name.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return CMAnnotationPropertyValue - can be null
-	 */
-	public CMAnnotationPropertyValue getCMElementPropertyValue(String elementName, String propertyName) {
-		CMAnnotationPropertyValue result = null;
-		List val = getCMElementPropertyValues(elementName, propertyName);
-		if (val != null){
-			result = new CMAnnotationPropertyValue( fileInfo, val);
-		}
-		return result;
-	}
-	
-	private CMAttributeAnnotation getCMAttributeAnnotation(List annotationListForElement, String attributeName) {
-		for (int i=0;i < annotationListForElement.size();i++){
-			CMElementAnnotation annotationForElement = (CMElementAnnotation)annotationListForElement.get(i);
-			if (annotationForElement != null){
-				Map attributeAnnotations = annotationForElement.getAttributeAnnotations();
-				if (attributeAnnotations != null){
-					CMAttributeAnnotation attributeAnnotation = (CMAttributeAnnotation)attributeAnnotations.get(attributeName);
-					if (attributeAnnotation != null){
-						return attributeAnnotation;
-					}
-				}
-			}
-		}
-		return null ;
-	}
-
-	private List getNLSPropertyValues(CMAnnotation annotation, String propertyName){
-		List result =  annotation.getAnnotationProperty(propertyName).getPropertyValues();
-		for (int i=0;i<result.size();i++){
-			String val = (String)result.get(i);
-			if (val.startsWith("%") && !val.startsWith("%%")){ //$NON-NLS-1$ //$NON-NLS-2$
-				val = getNLSPropertyValue(val);
-				result.set(i, val);
-				//also update property annotation to avoid needing to go thru bundle next time
-				annotation.getAnnotationProperty(propertyName).getPropertyValues().set(i, val);
-			}
-		}
-		return result;
-	}
-
-	//will return null if there is an IOException with ResourceBundle
-	private String getNLSPropertyValue(String val){
-		String NOT_FOUND = Messages.CMAnnotationMap_key_not_found;
-		try{
-			ResourceBundle resourceBundle_ = getResourceBundle();		
-			if (resourceBundle_ != null){
-				String replVal = resourceBundle_.getString(val.substring(1));
-				return replVal;
-			}
-			//return original string
-			return val; 
-		} catch (IOException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationMap_IOException, new String[]{val}));
-			return null;
-		} catch (MissingResourceException e){
-			//fall thru
-			JSFCommonPlugin.log(e,  NLS.bind(Messages.CMAnnotationMap_MissingResource_exception, new String[]{val}));
-		}
-		return val.substring(1) + NOT_FOUND;
-	}
-
-	/**
-	 * Return the ICMAnnotationSourceFileInfo used to create this CMAnnotationMap
-	 * @return ICMAnnotationSourceFileInfo
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	
-	/**
-	 * @param val 
-	 * @return string value used for case sensitive or insensitive queries.
-	 */
-	public String getStringValueForCaseSensitivity(String val){
-		return isCaseSensitive ? val : val.toLowerCase();
-	}
-
-	private ResourceBundle getResourceBundle() throws IOException{		
-		if (resourceBundle == null){		
-			resourceBundle = locator.getResourceBundle();
-		}
-		return resourceBundle;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java
deleted file mode 100644
index fe28e9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java
+++ /dev/null
@@ -1,41 +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.contentmodel.annotation.internal;
-
-/**
- * Represents an annotation on a content model attribute
- * 
- * @author Gerry Kessler - Oracle
- *
- * @see CMElementAnnotation
- * @deprecated see common.metadata package
- */
-public class CMAttributeAnnotation extends CMAnnotation {
-	private String elementNodeSpec;
-	
-	/**
-	 * Constructor
-	 * @param elemNodeSpec
-	 * @param name
-	 */
-	public CMAttributeAnnotation(String elemNodeSpec, String name) {
-		super(name);
-		elementNodeSpec = elemNodeSpec;
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttrAnnotation: "); //$NON-NLS-1$
-		buf.append(getName()).append(": ").append(elementNodeSpec).append(": ").append(super.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.java
deleted file mode 100644
index 72048fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.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.contentmodel.annotation.internal;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-/**
- * Represents an annotation on a content model element.   
- * The element annotation object holds a map it's attribute annotations.
- * 
- * @author Gerry Kessler - Oracle
- * 
- * @see CMAttributeAnnotation
- * @deprecated see common.metadata package
- */
-public class CMElementAnnotation extends CMAnnotation {
-	private final Hashtable attributes = new Hashtable();
-
-	/**
-	 * Constructor
-	 * @param name
-	 */
-	public CMElementAnnotation(String name) {
-		super(name);
-	}
-
-	/**
-	 * Return this element annotations attribute annotations.
-	 * Will NOT be null but may be empty. 
-	 * @return Map
-	 */
-	public Map getAttributeAnnotations() {
-		return attributes;
-	}
-
-	/**
-	 * Add an attribute annotation to this element's attribute annotations map
-	 * 
-	 * @param annotation
-	 */
-	public void addCMAttributeAnnotation(CMAttributeAnnotation annotation){
-		attributes.put(annotation.getName(), annotation);		
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("ElementAnnotation: "); //$NON-NLS-1$
-		buf.append(getName()).append(": ").append(super.toString()); //$NON-NLS-1$
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java
deleted file mode 100644
index b6f876b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java
+++ /dev/null
@@ -1,84 +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.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-
-/**
- * Default implementation of CMAnnotationSourceFileLocator that will locate annotations
- * and resource bundles relative to the plugin that extends annotationFiles.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public class CMPluginRelativeSourceFileLocator extends CMAnnotationSourceFileLocator {
-	
-	/* 
-	 * Returns InputStream of annotation file from plugin relative location.
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotations.internal.contentmodel.internal.annotation.AbstractCMSourceFileLocator#getAnnotationSourceInputStream()
-	 */
-	public InputStream getAnnotationSourceInputStream() throws IOException {
-		URL url = FileLocator.find(Platform.getBundle(fileInfo.getBundleId()), Path.fromOSString(fileInfo.getAnnotationFileLocation()), null);
-		if (url != null) {
-			return url.openStream();
-		}
-		return null;
-	}
-
-	/* 
-	 * Returns property resource bundle if it exists.  May return null.
-	 * This implementation assumes that the basename of the bundle is the same 
-	 * as the source file name and in the same directory.
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileLocator#getResourceBundle()
-	 */
-	public ResourceBundle getResourceBundle() throws IOException, MalformedURLException {
-		URL bundleURL = getAnnotationPropertiesFileBasenameURL();
-		ResourceBundle resourceBundle = ResourceBundleHelper.getResourceBundle(getBaseNameURL(bundleURL));
-		return resourceBundle;
-	}
-	
-	private URL getAnnotationPropertiesFileBasenameURL()  {
-		IPath annotationPath = Path.fromOSString(fileInfo.getAnnotationFileLocation()); 
-		IPath annotationFolder = annotationPath.removeLastSegments(1);
-		IPath propertiesLocation = annotationPath.removeFirstSegments(annotationPath.segmentCount() - 1).removeFileExtension();
-		// append location of propertiles file
-		IPath propertiesFile = annotationFolder.append(propertiesLocation);
-	
-		// append .properties extension if needed
-		if (propertiesFile.getFileExtension() == null)
-			propertiesFile = propertiesFile.addFileExtension("properties"); //$NON-NLS-1$
-		// create a URL out of the properties file location
-		return FileLocator.find(Platform.getBundle(fileInfo.getBundleId()),
-				propertiesFile, null);
-	}
-
-	
-	private String getBaseNameURL(URL bundleURL) {
-		IPath url = new Path(bundleURL.toExternalForm());
-		if (url.getFileExtension() != null)
-			url = url.removeFileExtension();
-		return url.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.java
deleted file mode 100644
index ac34828..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.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.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-
-/**
- * Interface used to build internal data model of annotations.   
- * Decouples the data model from the parser so that model can be changed in the future.
- * 
- * Not intended to be implemented by others.
- * 
- * @author Gerry Kessler - Oracle
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationAdvisor
- * @deprecated see common.metadata package
- */
-public interface ICMAnnotationAdvisor {
-	/**
-	 * Returns annotationFile extension information
-	 * @return ICMAnnotationSourceFileInfo 
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo();
-	/**
-	 * Set whether or not elements, attributes and property name querying is case sensitive or not.
-	 * @param val 
-	 */
-	public void setCaseSensitive(boolean val);
-	/**
-	 * Method to be used by a ICMAnnotationFileParser to assign a property and a value 
-	 * to an element in a particular content model defined by the ICMAnnotationSourceFileInfo.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @param propertyValue
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
-	 */
-	public void addElementAnnotation(String elementName, String propertyName, String propertyValue);
-	/**
-	 * Method to be used by a ICMAnnotationFileParser to assign a property and a value 
-	 * to an attribute of an element in a particular content model defined by the ICMAnnotationSourceFileInfo.
-	 * 
-	 * @param elementName
-	 * @param attributeName 
-	 * @param propertyName
-	 * @param propertyValue
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
-	 */
-	public void addAttributeAnnotation(String elementName, String attributeName, String propertyName, String propertyValue);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java
deleted file mode 100644
index 58d1ab9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java
+++ /dev/null
@@ -1,81 +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.contentmodel.annotation.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @deprecated see common.metadata package
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.messages"; //$NON-NLS-1$
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileParserHelper_class_not_found;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileParserHelper_illegal_access_exception;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileParserHelper_instantiation_exception;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileParserHelper_unable_to_find_bundleid;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileParserHelper_unable_to_parse;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileRegistry_load_error;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationFileRegistryReader_problem;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationMap_IOException;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationMap_key_not_found;
-
-	/**
-	 * see message.properties
-	 */
-	public static String CMAnnotationMap_MissingResource_exception;
-
-	private Messages() {
-        // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java
deleted file mode 100644
index 4140748..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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
- *     Gerry Kessler/Oracle - copied from org.eclipse.wst.sse.core.internal.encoding.util and modified
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-
-/**
- * @deprecated see common.metadata package
- *
- */
-public class ResourceBundleHelper {
-
-	/**
-	 * @param resourceURI
-	 * @return the resource bundle in resourceURI using the default locale
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(String resourceURI) throws MalformedURLException, IOException {
-		return getResourceBundle(resourceURI, Locale.getDefault());
-	}
-
-	/**
-	 * @param resourceURI
-	 * @param targetLocale
-	 * @return the resource bundle in resourceURI using the target locale
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(String resourceURI, Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURI
-		// we make the assumption that the resourceURI points to the local
-		// file system
-
-		int index = resourceURI.lastIndexOf("/"); //$NON-NLS-1$
-		if (index == -1) {
-			throw new IllegalArgumentException("Invalid resourceURI"); //$NON-NLS-1$
-		}
-
-		// Below we set 'resourceDirectory' so that it ends with a '/'.
-		// Here's an excerpt from the ClassLoader Javadoc ...
-		// Any URL that ends with a '/' is assumed to refer to a directory.
-		// Otherwise, the URL is assumed
-		// to refer to a JAR file which will be opened as needed.
-		//
-		String resourceDirectory = resourceURI.substring(0, index + 1);
-		String resourceBundleName = resourceURI.substring(index + 1);
-
-		// create a class loader with a class path that points to the resource
-		// bundle's location
-		//         
-		URL[] classpath = new URL[1];
-		classpath[0] = FileLocator.resolve(new URL(resourceDirectory));
-		ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(resourceBundleName, targetLocale, resourceLoader);
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties
deleted file mode 100644
index ba366a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-CMAnnotationFileRegistryReader_problem=Problem adding annotation file: bundle = {0}, uri = {1}, location = {2}
-CMAnnotationFileParserHelper_unable_to_parse=Unable to parse: {0} with {1}
-CMAnnotationFileParserHelper_unable_to_find_bundleid=Unable to find bundleId: {0} in {1}
-CMAnnotationFileParserHelper_class_not_found=ClassNotFoundException: {0} in {1}
-CMAnnotationFileParserHelper_instantiation_exception=InstantiationException: {0} in {1}
-CMAnnotationMap_MissingResource_exception=MissingResourceException for NLSPropertyValue: {0} 
-CMAnnotationFileRegistry_load_error=Error loading grammar for: {0}
-CMAnnotationMap_key_not_found=(key not found)
-CMAnnotationMap_IOException=IOException for NLSPropertyValue: {0}
-CMAnnotationFileParserHelper_illegal_access_exception=IllegalAccessException: {0} in {1}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java
deleted file mode 100644
index c47051c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java
+++ /dev/null
@@ -1,17 +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
- *    
- ********************************************************************************/
-
-/**
- * Design-time metadata framework.
- * <p><b>Deprecated - and no longer in use.   Use common.metadata</b></p>
- */
-package org.eclipse.jst.jsf.contentmodel.annotation;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
deleted file mode 100644
index 37e7c6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
+++ /dev/null
@@ -1,110 +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.context;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * An abstract implementation of the IDelegatingFactory interface
- * 
- * Clients may extend this class.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDelegatingFactory implements IDelegatingFactory {
-
-	/* instance attributes */
-	
-	/**
-	 * the list of registered factory delegates
-	 */
-	protected 	final List<IAdaptable>  _delegates;
-	
-	private 	final List<Class>		_supportedDelegates;
-
-	/**
-	 * @param supportedDelegateTypes -- populates the list of classes used
-	 * by the isValidDelegate contract
-	 */
-	protected AbstractDelegatingFactory(Class[]  supportedDelegateTypes)
-	{
-		_delegates = new ArrayList<IAdaptable>();
-		
-		final List<Class> supportedTypes = new ArrayList<Class>();
-		supportedTypes.addAll(Arrays.asList(supportedDelegateTypes));
-		_supportedDelegates = Collections.unmodifiableList(supportedTypes);
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#addFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final void addFactoryDelegate(IAdaptable delegate) 
-	{
-		synchronized(_delegates)
-		{
-			
-			if (!_delegates.contains(delegate)
-					&& isValidDelegate(delegate))
-			{
-				_delegates.add(delegate);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#removeFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final boolean removeFactoryDelegate(IAdaptable delegate) 
-	{
-		synchronized(_delegates)
-		{
-			return _delegates.remove(delegate);
-		}	
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#getValidDelegateTypes()
-	 */
-	public final List<Class> getValidDelegateTypes() 
-	{
-		return _supportedDelegates;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#isValidDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final boolean isValidDelegate(IAdaptable delegate) 
-	{
-		for (final Iterator<Class> it = _supportedDelegates.iterator(); it.hasNext();)
-		{
-			final Class clazz = it.next();
-			
-			// if the delegate supports one of the valid delegate classes
-			// via adaptation, then it is a valid delegate
-			if (delegate.getAdapter(clazz) != null)
-			{
-				return true;
-			}
-		}
-		
-		// if no found, delegate is not supported
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java
deleted file mode 100644
index 9dad348..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java
+++ /dev/null
@@ -1,42 +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.context;
-
-
-/**
- * A convenience super-type for all context instances that implement
- * IDocumentContext or one of its sub-types. 
- * 
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDocumentContext implements IDocumentContext {
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapterClass) 
-	{
-		if (adapterClass.equals(IDocumentContext.class))
-		{
-			return this;
-		}
-		else if (adapterClass.equals(IModelContext.class))
-		{
-			return this;
-		}
-		
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java
deleted file mode 100644
index 6e91576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java
+++ /dev/null
@@ -1,81 +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.context;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Defines a type of factory that can have delegate factories to help it
- * create an appropriate instance type.  The general contract for implementors
- * is:
- * 
- * 1) You must follow the isValidDelegate contract.
- * 2) You should try to create an instance yourself and only delegate
- *    if cannot do it yourself.  Deviations from this rule must be
- *    clearly documented to ensure clients understand how the factory works.
- * 
- * Clients may NOT implement this interface.  
- * Extend AbstractDelegatingFactory instead.
- * 
- * @author cbateman
- *
- */
-public interface IDelegatingFactory 
-{
-	/** -- Delegates */
-	/** If this factory is asked to construct but does not know how to,
-	 *  it will ask each of its registered delegates to do so in the order
-	 *  they were added.
-	 */
-	
-	/**
-	 * Adds delgate to the end of the list of factory delegates if the list
-	 * does not already contain it. 
-	 * 
-	 * @param delegate
-	 * @throws ClassCastException if delegate does not implement an expected
-	 * interface.  Each implementor can define what delegates are valid
-	 * based on the isValidDelegate() and getValidDelegates contracts
-	 */
-	void addFactoryDelegate(IAdaptable  delegate);
-	
-	
-	/**
-	 * @param delegate
-	 * @return true if delegate was removed, false if delegate wasn't in
-	 * the list of delegates
-	 */
-	boolean removeFactoryDelegate(IAdaptable delegate);
-	
-	/**
-	 * @return a list of Class objects that represent the interfaces
-	 * that may be passed to addFactoryDelegate.  Implementor should 
-	 * return at least one supported class.
-	 */
-	List<Class>  getValidDelegateTypes();
-	
-	
-	/**
-	 * The return value of this method should conform to the following contract:
-	 * 
-	 * Let v = getValidDelegates.  Then isValidDelegate should return true
-	 * only if the set of v contains a Class for which delegate.getAdapter(Class)
-	 * returns a non-null value.
-	 * 
-	 * @param delegate
-	 * @return true if delegate is supported, false otherwise.
-	 */
-	boolean isValidDelegate(IAdaptable delegate);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java
deleted file mode 100644
index fe7d033..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java
+++ /dev/null
@@ -1,28 +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.context;
-
-/**
- * Encapsulates runtime context in a JFace IDocument model
- * 
- * Clients may NOT implement this interface directly but may sub-class
- * Extend AbstractDocumentContext instead.
-
- * @author cbateman
- *
- */
-public interface IDocumentContext extends IModelContext 
-{
-	// TODO: might make sense to have a getDocument() accessor here
-	// currently empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.java
deleted file mode 100644
index 1ace325..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Encapsulates the current runtime context in some model.
- * 
- * This interface may be sub-classed but not implemented directly
- */
-public interface IModelContext extends IAdaptable
-{
-	// current empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/package-info.java
deleted file mode 100644
index f31d0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/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
- *    
- ********************************************************************************/
-
-/**
- * Model context framework.  
- */
-package org.eclipse.jst.jsf.context;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.java
deleted file mode 100644
index d7b8c7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.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.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * The super-class of all context resolver impls.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractContextResolver implements IContextResolver {
-
-    public abstract boolean canResolveContext(IModelContext modelContext); 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.java
deleted file mode 100644
index 3571dc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.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.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * The parent of all IDocumentContextResolver implementations.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDocumentContextResolver implements
-        IDocumentContextResolver {
-
-    public abstract boolean canResolveContext(IModelContext modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java
deleted file mode 100644
index 4471cab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java
+++ /dev/null
@@ -1,33 +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.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * Super type of all context resolvers.  
- * 
- * May be sub-classed but should not be implemented directly.
- * Use AbstractContextResolver to implement.
- * 
- * @author cbateman
- *
- */
-public interface IContextResolver 
-{
-	/**
-	 * @param modelContext
-	 * @return true if this resolver can resolve context information
-	 * based on this context
-	 */
-	boolean canResolveContext(IModelContext  modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java
deleted file mode 100644
index 0191c3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java
+++ /dev/null
@@ -1,28 +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.context.resolver;
-
-/**
- * The super-interface for all context resolvers that are related
- * to IDocumentContext's.
- * 
- * This interface may NOT be implemented by clients directly but may be sub-classed.
- * Use AbstractDocumentContextResolver for implementation.
- * 
- * @author cbateman
- *
- */
-public interface IDocumentContextResolver extends IContextResolver 
-{
-	// currently empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/package-info.java
deleted file mode 100644
index 27cb48d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/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
- *    
- ********************************************************************************/
-
-/**
- * Context resolver framework.  
- */
-package org.eclipse.jst.jsf.context.resolver;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java
deleted file mode 100644
index 4677bc8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java
+++ /dev/null
@@ -1,41 +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.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Defines a type of context resolver used to resolve the current context
- * in the XML DOM context.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IDOMContextResolver extends IDocumentContextResolver 
-{
-	/**
-	 * @return the complete DOM Document for this context or null if it
-	 * cannot be resolved.
-	 */
-	Document	getDOMDocument();
-	
-	/**
-	 * @return the node which the current context is pointing to.
-     * If document context is on an attribute will return that attribute
-	 */
-	Node		getNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.java
deleted file mode 100644
index 12e9987..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-
-/**
- * Resolves meta-data for a particular context
- * 
- * This interface may sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IMetadataContextResolver extends IDocumentContextResolver 
-{
-    /**
-     * @param key 
-     * @return a list of one or more String values associated with key
-     * for the current context location. 
-     */
-    List getPropertyValue(String key);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.java
deleted file mode 100644
index 1727b2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl.StructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-
-/**
- * A factory for creating context resolvers that work with structured
- * document contexts
- * 
- * This factory may be used but not implemented or extended by clients.
- * TODO:
- * Note that getTextRegionResolver() will be moved to to an internal factory
- * interface and should not be considered part of the provisional API
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentContextResolverFactory 
-{
-	
-	/**
-	 * The global instance of the factory
-	 */
-	public static final IStructuredDocumentContextResolverFactory  INSTANCE = StructuredDocumentContextResolverFactory.getInstance();
-
-	/**
-	 * @param context
-	 * @return a resolver capable of resolving information in context or null
-	 * if one cannot be created.
-	 */
-	IDOMContextResolver	getDOMContextResolver(IStructuredDocumentContext context);
-	
-	/**
-     * **Non-WTP Clients: this method should not be considered API**
-     * 
-	 * @param context
-	 * @return a resolver capable of resolving information in the context or
-	 * null if one cannot be created
-	 */
-	ITextRegionContextResolver getTextRegionResolver(IStructuredDocumentContext context);
-	
-	/**
-	 * @param context
-	 * @return a resolver capable of resolving information in the context or
-	 * null if one cannot be created
-	 */
-	IWorkspaceContextResolver  getWorkspaceContextResolver(IStructuredDocumentContext context);
-	
-    /**
-     * @param context
-     * @return a resolver capable of resolving information in the context
-     * or null one cannot be created
-     */
-    ITaglibContextResolver getTaglibContextResolver(IStructuredDocumentContext context);
-    
-    /**
-     * @param context
-     * @return a resolver capable of resolving information in the context
-     * or null if one cannot be created
-     */
-    IMetadataContextResolver getMetadataContextResolver(IStructuredDocumentContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.java
deleted file mode 100644
index 34c4b6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Defines a context resolver that resolves tag library information
- * for a particular context.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface ITaglibContextResolver extends IDocumentContextResolver 
-{
-    /**
-     * @param node 
-     * @return the URI corresponding to the taglib that defines the 
-     * node in the context document or null if it cannot be found
-     */
-    String getTagURIForNodeName(Node node);
-    
-	/**
-	 * @param uri
-	 * @return the tag prefix used in the context document for
-	 * the provided uri or null if it cannot be found.
-	 */
-	String	 getTagPrefixForURI(String uri);
-	
-	/**
-	 * A list all tags in the document context that are called
-	 * tagName defined in the namespace indicated by uri
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @return a (possibly empty) list of tags -- must never
-	 * be null.  Indicate none found with an empty list.
-	 */
-	NodeList getTagsByNamespaceURI(String uri, String tagName);
-    
-    /**
-     * @param node
-     * @return true if node has a tag library associated with it in this context
-     */
-    public boolean hasTag(Node node);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java
deleted file mode 100644
index 9a9f399..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java
+++ /dev/null
@@ -1,42 +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.context.resolver.structureddocument;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-
-/**
- * A resolver to determine the current context within the Eclipse
- * workspace.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IWorkspaceContextResolver extends IDocumentContextResolver
-{
-	/**
-	 * @return the project that contains the document context
-	 * or null if it cannot be determined
-	 */
-	IProject getProject();
-	
-	/**
-	 * @return the resource that contains the document context 
-	 * or null if it cannot be determined.
-	 * This should normally be an IFile.
-	 */
-	IResource getResource();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/IStructuredDocumentContextResolverFactory2.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/IStructuredDocumentContextResolverFactory2.java
deleted file mode 100644
index c344ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/IStructuredDocumentContextResolverFactory2.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.context.resolver.structureddocument.internal;
-
-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;
-
-/**
- * An additional factory interface for context resolvers.
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentContextResolverFactory2 extends
-        IStructuredDocumentContextResolverFactory
-{
-    /**
-     * The global instance of the factory
-     */
-    public static final IStructuredDocumentContextResolverFactory2  INSTANCE = 
-        (IStructuredDocumentContextResolverFactory2) IStructuredDocumentContextResolverFactory.INSTANCE;
-
-    /**
-     * Same as getTaglibContextResolver but checks delegate factory first.
-     * 
-     * @param context
-     * @return a resolver capable of resolving information in the context
-     * or null one cannot be created
-     */
-    ITaglibContextResolver getTaglibContextResolverFromDelegates(IStructuredDocumentContext context);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java
deleted file mode 100644
index aca8435..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java
+++ /dev/null
@@ -1,128 +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.context.resolver.structureddocument.internal;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Defines a resolver that can resolve context information in the
- * structured document region context.
- * 
- * Unless otherwise stated, the context region is the most specific
- * region (leaf) in which the current context is contained.
- * 
- * Note: this interface may use internal/provisional types.
- * 
- * @author cbateman
- *
- */
-public interface ITextRegionContextResolver extends IDocumentContextResolver 
-{
-	/**
-	 * @return the text for the context region
-	 */
-	String getRegionText();
-	
-	/**
-	 * @return the document relative offset of the start of the region
-	 * in which the context in is contained or -1 if the offset cannot be determined.
-	 */
-	int getStartOffset();
-	
-	/**
-	 * @return the document relative offset of the end of the region
-	 * in which the context is contained or -1 if the offset cannot be determined
-	 */
-	int getEndOffset();
-	
-	/**
-	 * @return the length of the most specific region in which the context
-	 * is contained or -1 if the length cannot be determined.
-	 */
-	int getLength();
-	
-	/**
-	 * @return the most specific TextRegion type for the current context  
-	 */
-	String  getRegionType();
-	
-	/**
-	 * @return the path to the most specific TextRegtion for the current context
-	 * note that this does not include the actual region for the current region.
-	 * That is returned by getRegionType(). 
-	 *
-	 */
-	String[]  getRegionTypePath();
-	
-	
-	/**
-	 * The offset into the structured document will be set to be
-	 * the start offset of the previous region
-	 * 
-	 * @return a context for the previous sibling of this context's
-	 * text region parent or null if no previous sibling exists
-	 */
-	IStructuredDocumentContext getPreviousContext();
-	
-	/**
-	 * The offset into the structured document will be set to be
-	 * the start offset of the next region
-	 * 
-	 * @return a context for the next sibling of this context's
-	 * text region parent or null if no next sibling exists
-	 */
-	IStructuredDocumentContext getNextContext();
-	
-	/**
-	 * Relative path works backwards from the current context.  So if the
-	 * path to current context is /a/b/c/d/e then:
-	 * 
-	 * matchesRelative({"e"}) == true
-	 * matchesRelative({"d", "e"}) == true
-	 * matchesRelative({"c", "d", "e"}) == true
-	 * matchesRelative({"b", "c", "d", "e"}) == true
-	 * matchesRelative({"a", "b", "c", "d", "e"}) == true
-	 * 
-	 * because in every case the path matches working backward from the current
-	 * context 
-	 * 
-	 * but
-	 * 
-	 * matchesRelative({a}) == false because context/.. == e not a
-	 * 
-	 * TODO: what does path = new String[0] mean?
-	 * 
-	 * @param path
-	 * @return true if the relative path matches the path to the current context
-	 * working relative to the current context.
-	 */
-	boolean   matchesRelative(String[] path);
-	
-	/**
-	 * Absolute path works forward from the root of the document to the 
-	 * current context.  So if the path to the current context is /a/b/c/d/e then:
-	 * 
-	 * matchesAbsolute({"a", "b", "c", "d", "e"}) == true
-	 * 
-	 * but 
-	 * 
-	 * matchesAbsolute({"b", "c", "d", "e"}) == true because starting from the root
-	 * you cannot follow /b/c/d/e to the context.
-	 * 
-	 * @param path
-	 * @return true if the absolute path from the root of the document 
-	 * matches the current context
-	 */
-	boolean   matchesAbsolute(String[] path);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ResolverUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ResolverUtil.java
deleted file mode 100644
index fda4dbc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ResolverUtil.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.context.resolver.structureddocument.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.text.IDocument;
-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;
-
-/**
- * Internal convenience class to simplify regularly repeated tasks
- * @author cbateman
- *
- */
-public final class ResolverUtil
-{
-    /**
-     * This method will generally only work if the document is an
-     * IStructuredDocument.
-     * 
-     * @param document
-     * @return the IFile corresponding to document or null if not applicable.
-     * 
-     */
-    public static IFile getFileForDocument(final IDocument document)
-    {
-        final IStructuredDocumentContext context =
-            IStructuredDocumentContextFactory.INSTANCE.getContext(document,
-                    -1);
-
-        if (context != null)
-        {
-            final IWorkspaceContextResolver wkResolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-            if (wkResolver != null)
-            {
-                final IResource res = wkResolver.getResource();
-
-                if (res instanceof IFile)
-                {
-                    return (IFile) res;
-                }
-            }
-        }
-        return null;
-    }
-
-    private ResolverUtil()
-    {
-        // no instantiation
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.java
deleted file mode 100644
index 76d7593..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Resolves DOM-related information in the provided context
- * 
- * @author cbateman
- *
- */
-class DOMContextResolver implements IDOMContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-    //private ITextRegionContextResolver              _regionResolver; // null; lazy initialized if needed
-	
-	DOMContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver#getDOMDocument()
-	 */
-	public Document getDOMDocument() 
-	{
-        return StructuredDocumentResolverUtil.getDOMDocument((IStructuredDocument)_context.getStructuredDocument());
-	}
-
-	public Node getNode()
-	{
-		IndexedRegion region = StructuredDocumentResolverUtil.getIndexedRegion((IStructuredDocument) _context.getStructuredDocument(), _context.getDocumentPosition());
-        
-        if (region instanceof Node)
-        {
-            return (Node) region;
-        }
-        
-        return null;
-	}
-    
-
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return modelContext.getAdapter(IStructuredDocumentContext.class) != null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
deleted file mode 100644
index 495589f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
+++ /dev/null
@@ -1,93 +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.context.resolver.structureddocument.internal.impl;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-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.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IMetadataContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A default implementation of meta-data context resolver
- * 
- * @author cbateman
- *
- */
-class MetadataContextResolver implements IMetadataContextResolver 
-{
-    private final IStructuredDocumentContext        _context;
-    
-    /**
-     * @param context
-     */
-    public MetadataContextResolver(IStructuredDocumentContext context)
-    {
-        _context = context;
-    }
-    
-    public List getPropertyValue(final String key) 
-    {
-        final DOMContextResolver domResolver = new DOMContextResolver(_context);
-        final WorkspaceContextResolver wsResolver = new WorkspaceContextResolver(_context);
-        final TaglibContextResolver  tagResolver =
-            new TaglibContextResolver(_context);
-        
-        final Node curNode = domResolver.getNode();
-        
-        if (curNode instanceof Attr)
-        {
-            final Attr attribute = (Attr) curNode;
-            final Element  element = attribute.getOwnerElement();
-            final String uri = tagResolver.getTagURIForNodeName(element);
-            final IProject project = wsResolver.getProject();
-            
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName()+"/"+attribute.getLocalName(), key); //$NON-NLS-1$
-            if( trait != null )
-            {
-            	return TraitValueHelper.getValueAsListOfStrings(trait);
-            }
-            
-        }
-        else if (curNode instanceof Element)
-        {
-            final Element  element = (Element) curNode;
-            final String uri = tagResolver.getTagURIForNodeName(element);
-            final IProject project = wsResolver.getProject();
-            
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName(), key);
-            if( trait != null )
-            {
-            	return TraitValueHelper.getValueAsListOfStrings(trait);
-            }
-        }
-        
-        return Collections.EMPTY_LIST;
-    }
-
-    public boolean canResolveContext(IModelContext modelContext) {
-        return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java
deleted file mode 100644
index 2b0cf8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java
+++ /dev/null
@@ -1,325 +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.context.resolver.structureddocument.internal.impl;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-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.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.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * Implements a factory for creating context resolvers for structured document
- * contexts.
- * 
- * @author cbateman
- * 
- */
-public class StructuredDocumentContextResolverFactory extends
-AbstractDelegatingFactory implements
-IStructuredDocumentContextResolverFactory, IStructuredDocumentContextResolverFactory2
-{
-    /* static attributes */
-    private static StructuredDocumentContextResolverFactory INSTANCE;
-
-    /**
-     * @return an instance (possibly shared) of the this factory
-     */
-    public synchronized static StructuredDocumentContextResolverFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new StructuredDocumentContextResolverFactory();
-        }
-
-        return INSTANCE;
-    }
-
-    /**
-     * Constructor
-     */
-    protected StructuredDocumentContextResolverFactory()
-    {
-        super(new Class[]
-                        { IStructuredDocumentContextResolverFactory.class });
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory#getDOMContextResolver(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-     */
-    public IDOMContextResolver getDOMContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        IDOMContextResolver resolver = internalGetDOMResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = delegateGetDOMResolver(context);
-        }
-
-        return resolver;
-    }
-
-    private IDOMContextResolver internalGetDOMResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new DOMContextResolver(context);
-        }
-
-        return null;
-    }
-
-    private IDOMContextResolver delegateGetDOMResolver(
-            final IStructuredDocumentContext context)
-    {
-        synchronized (_delegates)
-        {
-            for (final IAdaptable adaptable : _delegates)
-            {
-
-                final IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) adaptable
-                .getAdapter(IStructuredDocumentContextResolverFactory.class);
-
-                if (delegateFactory != null)
-                {
-                    final IDOMContextResolver contextResolver = delegateFactory
-                    .getDOMContextResolver(context);
-
-                    if (contextResolver != null)
-                    {
-                        return contextResolver;
-                    }
-                }
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory#getTextRegionResolver(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-     */
-    public ITextRegionContextResolver getTextRegionResolver(
-            final IStructuredDocumentContext context)
-    {
-        ITextRegionContextResolver resolver = internalGetTextRegionResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = delegateGetTextRegionResolver(context);
-        }
-
-        return resolver;
-    }
-
-    private ITextRegionContextResolver internalGetTextRegionResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new TextRegionContextResolver(context);
-        }
-
-        return null;
-    }
-
-    private ITextRegionContextResolver delegateGetTextRegionResolver(
-            final IStructuredDocumentContext context)
-    {
-        synchronized (_delegates)
-        {
-            for (final Object element : _delegates)
-            {
-                final IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) element)
-                .getAdapter(IStructuredDocumentContextResolverFactory.class);
-                final ITextRegionContextResolver contextResolver = delegateFactory
-                .getTextRegionResolver(context);
-
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-
-            return null;
-        }
-    }
-
-    public IWorkspaceContextResolver getWorkspaceContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        IWorkspaceContextResolver resolver = internalGetWorkspaceContextResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = delegateGetWorkspaceContextResolver(context);
-        }
-
-        return resolver;
-
-    }
-
-    private IWorkspaceContextResolver internalGetWorkspaceContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new WorkspaceContextResolver(context);
-        }
-
-        return null;
-    }
-
-    private IWorkspaceContextResolver delegateGetWorkspaceContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        synchronized (_delegates)
-        {
-            for (final Object element : _delegates)
-            {
-                final IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) element)
-                .getAdapter(IStructuredDocumentContextResolverFactory.class);
-                final IWorkspaceContextResolver contextResolver = delegateFactory
-                .getWorkspaceContextResolver(context);
-
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-
-            return null;
-        }
-    }
-
-    public ITaglibContextResolver getTaglibContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        // check the delegats first
-        ITaglibContextResolver resolver = internalGetTaglibContextResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = delegateGetTaglibContextResolver(context);
-        }
-
-        return resolver;
-    }
-
-    public ITaglibContextResolver getTaglibContextResolverFromDelegates(
-            final IStructuredDocumentContext context)
-    {
-        // check the delegats first
-        ITaglibContextResolver resolver = delegateGetTaglibContextResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = internalGetTaglibContextResolver(context);
-        }
-
-        return resolver;
-    }
-
-    private ITaglibContextResolver internalGetTaglibContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new TaglibContextResolver(context);
-        }
-
-        return null;
-    }
-
-    private ITaglibContextResolver delegateGetTaglibContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        synchronized (_delegates)
-        {
-            for (final IAdaptable adapter : _delegates)
-            {
-                final IStructuredDocumentContextResolverFactory delegateFactory =
-                    (IStructuredDocumentContextResolverFactory) adapter
-                    .getAdapter(IStructuredDocumentContextResolverFactory.class);
-
-                if (delegateFactory != null)
-                {
-                    final ITaglibContextResolver contextResolver = delegateFactory
-                            .getTaglibContextResolver(context);
-
-                    if (contextResolver != null)
-                    {
-                        return contextResolver;
-                    }
-                }
-            }
-
-            return null;
-        }
-    }
-
-    public IMetadataContextResolver getMetadataContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        IMetadataContextResolver resolver = internalGetMetadataContextResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = delegateGetMetadataContextResolver(context);
-        }
-
-        return resolver;
-    }
-
-    private IMetadataContextResolver internalGetMetadataContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new MetadataContextResolver(context);
-        }
-
-        return null;
-    }
-
-    private IMetadataContextResolver delegateGetMetadataContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        synchronized (_delegates)
-        {
-            for (final Object element : _delegates)
-            {
-                final IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) element)
-                .getAdapter(IStructuredDocumentContextResolverFactory.class);
-                final IMetadataContextResolver contextResolver = delegateFactory
-                .getMetadataContextResolver(context);
-
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.java
deleted file mode 100644
index 9a4a780..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.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.context.resolver.structureddocument.internal.impl;
-
-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.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-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.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- * Defines common utility methods for document resolvers
- */
-final class StructuredDocumentResolverUtil 
-{
-    static IDOMDocument getDOMDocument(IStructuredDocument document)
-    {
-        IStructuredModel model = getStructuredModel(document);
-        
-        try
-        {
-            if (model instanceof IDOMModel)
-            {
-                return ((IDOMModel)model).getDocument();
-            }
-        }
-        finally
-        {
-            if (model != null)
-            {
-                model.releaseFromRead();
-            }
-        }
-        
-        return null;
-    }
-    
-    static IndexedRegion getIndexedRegion(final IStructuredDocument document, final int documentOffset)
-    {
-        // C.B: most of this logic was copied from ContentAssistUtils.getNodeAt
-        // I chose to copy rather than just call that because ContentAssistUtils is
-        // internal
-        IStructuredModel model = getStructuredModel(document);
-        IndexedRegion             region = null;
-        if (model != null)
-        {
-            try
-            {
-                int lastOffset = documentOffset;
-                region = model.getIndexedRegion(documentOffset);
-                while (region == null && lastOffset >= 0) {
-                    lastOffset--;
-                    region = model.getIndexedRegion(lastOffset);
-                }
-                
-                // now we assume we have an element.  But our context may be
-                // on an attribute in that node, so we need to check
-                if (region instanceof IDOMElement)
-                {
-                    IDOMElement domElement = (IDOMElement) region;
-                    
-                    NamedNodeMap attributes = domElement.getAttributes();
-                    
-                    for (int i = 0; i < attributes.getLength(); i++)
-                    {
-                        Node  attrNode = attributes.item(i);
-                        
-                        if (attrNode instanceof IDOMAttr)
-                        {
-                            IDOMAttr attr = (IDOMAttr) attrNode;
-                            
-                            if (documentOffset >= attr.getStartOffset()
-                                    && documentOffset < attr.getEndOffset())
-                            {
-                                region = attr;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-            finally
-            {
-                model.releaseFromRead();
-            }
-        }
-
-        return region;
-    }
-    
-    /**
-     * @param document
-     * @return a structured model or null if one cannot be opened for document.
-     * Note: the caller is responsible for releasing the instance of structured
-     * model that gets returned.
-     */
-    private static IStructuredModel getStructuredModel(IStructuredDocument document)
-    {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        
-        if (modelManager != null)
-        {
-            return StructuredModelManager.getModelManager().getModelForRead(document); 
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java
deleted file mode 100644
index 16fb2fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java
+++ /dev/null
@@ -1,162 +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.context.resolver.structureddocument.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-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.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.w3c.dom.Attr;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * TODO: this resolver only applies to structured documents that can have
- * taglibs (I think only JSPs).  Should we move a different package?
- * Default taglib context resolver
- * 
- * @author cbateman
- *
- */
-class TaglibContextResolver implements ITaglibContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-	
-	TaglibContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagPrefixForURI(java.lang.String)
-	 */
-	public String getTagPrefixForURI(String uri) 
-	{
-		return null;
-	}
-
-    public boolean hasTag(final Node node)
-    {
-        Node checkNode = node;
-        
-        if (node instanceof Attr)
-        {
-            checkNode = ((Attr)node).getOwnerElement();
-        }
-        
-        return getTracker(checkNode) != null;
-    }
-    
-    private TaglibTracker getTracker(Node node)
-    {
-        final String prefix = node.getPrefix();
-
-        final TLDCMDocumentManager docMgr = 
-            TaglibController.getTLDCMDocumentManager(_context.getStructuredDocument());
-
-        // if there's no prefix, there's no way to id the tag library
-        // TODO: is this always true?  need to consult spec
-        // similar problem if couldn't load docMgr
-        if (prefix == null
-                || docMgr == null)
-        {
-            return null;
-        }
-        
-        for (final Iterator it = docMgr.getTaglibTrackers().iterator(); it.hasNext();)
-        {
-            final TaglibTracker tracker = (TaglibTracker) it.next();
-            
-            if (prefix.equals(tracker.getPrefix()))
-            {
-                return tracker;
-            }
-        }
-        
-        return null;
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagURIForNodeName(org.w3c.dom.Node)
-	 */
-	public String getTagURIForNodeName(final Node node) 
-    {
-        Node checkNode = node;
-        
-        if (node instanceof Attr)
-        {
-            checkNode = ((Attr)node).getOwnerElement();
-        }
-        
-        final TaglibTracker tracker = getTracker(checkNode);
-        
-        if (tracker != null)
-        {
-            return tracker.getURI();
-        }
-        
-        
-        return null;
-    }
-
-
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagsByNamespaceURI(java.lang.String, java.lang.String)
-     */
-    public NodeList getTagsByNamespaceURI(String uri, String tagName) 
-	{
-		//Document domDoc = new DOMContextResolver(_context).getDOMDocument();
-		return null;
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-        // must be a JSP page
-		Object adapter = modelContext.getAdapter(IStructuredDocumentContext.class);
-        
-        if (adapter instanceof IStructuredDocumentContext)
-        {
-            IStructuredDocumentContext context =  
-                (IStructuredDocumentContext) adapter;
-            IStructuredModel smodel = null;
-            
-            try
-            {
-                smodel = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument)context.getStructuredDocument());
-                return JSPUtil.isJSPContentType(smodel.getContentTypeIdentifier()); //$NON-NLS-1$
-            }
-            finally
-            {
-                if (smodel != null)
-                {
-                    smodel.releaseFromRead();
-                }
-            }
-        }
-
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java
deleted file mode 100644
index 9cf0f21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java
+++ /dev/null
@@ -1,295 +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.context.resolver.structureddocument.internal.impl;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-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.wst.sse.core.internal.provisional.text.IStructuredDocument;
-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;
-
-/*package*/ class TextRegionContextResolver implements ITextRegionContextResolver {
-
-	private final IStructuredDocumentContext		_context;
-	
-	/*package*/ TextRegionContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionText()
-	 */
-	public String getRegionText() 
-	{
-		final ITextRegionCollection parent = getParentRegion();
-		String text = null;
-		
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			text = parent.getText(me);
-		}
-	
-		return text;
-	}
-
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getEndOffset()
-	 */
-	public int getEndOffset() {
-		final ITextRegionCollection parent = getParentRegion();
-		int endOffset = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			endOffset =  parent.getEndOffset(me);
-		}
-		
-		return endOffset;
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getLength()
-	 */
-	public int getLength() {
-		final ITextRegionCollection parent = getParentRegion();
-		int length = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			length =  me.getLength();
-		}
-		
-		return length;
-
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getStartOffset()
-	 */
-	public int getStartOffset() 
-	{
-		final ITextRegionCollection parent = getParentRegion();
-		int startOffset = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			startOffset =  parent.getStartOffset(me);
-		}
-		
-		return startOffset;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionType()
-	 */
-	public String getRegionType() 
-	{
-		final ITextRegionCollection  parent = getParentRegion();
-		String  regionType = null;
-		
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			
-			if (me != null)
-			{
-				regionType = me.getType();
-			}
-		}
-		
-		return regionType;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionTypePath()
-	 */
-	public String[] getRegionTypePath() {
-		final ITextRegion[]  path = createPathToContext();
-		final String[] typePath = new String[path.length];
-		
-		for (int i = 0; i < path.length; i++)
-		{
-			typePath[i] = path[i].getType();
-		}
-		
-		return typePath;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getNextContext()
-	 */
-	public IStructuredDocumentContext getNextContext() 
-	{
-		ITextRegionCollection  parent = getParentRegion();
-		IStructuredDocumentContext newContext = null;
-		
-		if (parent != null)
-		{
-			final ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			ITextRegionList regions = parent.getRegions();
-			ITextRegion nextRegion = null;
-			for (final Iterator it = regions.iterator(); it.hasNext();)
-			{
-				if (it.next() == me
-						&& it.hasNext())
-				{
-					nextRegion = (ITextRegion) it.next();
-				}
-			}
-			
-			if (nextRegion != null)
-			{
-				// use the first position offset in the next region
-				final int documentPosition = parent.getStartOffset(nextRegion);
-				newContext = 
-					IStructuredDocumentContextFactory.INSTANCE.getContext(_context.getStructuredDocument(), documentPosition);
-			}
-		}
-		
-		return newContext;
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getPreviousContext()
-	 */
-	public IStructuredDocumentContext getPreviousContext() 
-	{
-		ITextRegionCollection  parent = getParentRegion();
-		IStructuredDocumentContext newContext = null;
-		
-		if (parent != null)
-		{
-			final ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			ITextRegionList regions = parent.getRegions();
-			final Iterator it = regions.iterator();
-			ITextRegion  prevRegion = null;
-			ITextRegion  nextRegion = null;
-			
-			SEARCH_LOOP: while (it.hasNext())
-			{
-				nextRegion = (ITextRegion) it.next();
-
-				if (nextRegion == me)
-				{
-					break SEARCH_LOOP;
-				}
-				
-				prevRegion = nextRegion;
-			}
-			
-			if (prevRegion != null)
-			{
-				// use the last position offset in the prev region
-				final int documentPosition = parent.getStartOffset(prevRegion);
-				newContext = 
-					IStructuredDocumentContextFactory.INSTANCE.getContext(_context.getStructuredDocument(), documentPosition);
-			}
-		}
-		
-		return newContext;
-	}
-
-	private ITextRegionCollection getParentRegion()
-	{
-		final ITextRegion[] path = createPathToContext();
-		ITextRegionCollection parent = null;
-		
-		if (path.length > 0)
-		{
-			parent =  (ITextRegionCollection) path[path.length-1];
-		}
-		
-		return parent;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#matchesRelative(java.lang.String[])
-	 */
-	public boolean matchesRelative(String[] path) {
-		final ITextRegion[]  myPath = createPathToContext();
-		return matchPath(myPath, path);
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#matchesAbsolute(java.lang.String[])
-	 */
-	public boolean matchesAbsolute(String[] path) 
-	{
-		final ITextRegion[]  myPath = createPathToContext(); 
-		// only works if myPath and path are the same length
-		return (myPath.length == path.length)
-					&& matchPath(myPath, path);
-	}
-
-	private boolean matchPath(ITextRegion[] myPath, String[] path)
-	{
-		boolean matches = false;
-		
-		// only makes sense if path is a containing subset of myPath
-		if (path.length <= myPath.length)
-		{
-			matches = true;
-			SEARCH_LOOP:
-			for (int i = 1; i <= path.length; i++)
-			{
-				if (!path[path.length-i].equals(myPath[myPath.length-i].getType()))
-				{
-					matches = false;
-					break SEARCH_LOOP;
-				}
-			}
-		}
-	
-		return matches;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-	}
-
-	private ITextRegion[] createPathToContext()
-	{
-		final List  regionPath = new ArrayList();
-		
-		final IStructuredDocument doc = (IStructuredDocument) _context.getStructuredDocument();
-
-		ITextRegion  container = doc.getRegionAtCharacterOffset(_context.getDocumentPosition());
-
-		while(container != null
-				&& container instanceof ITextRegionCollection)
-		{
-			regionPath.add(container);
-			container = ((ITextRegionCollection)container).getRegionAtCharacterOffset(_context.getDocumentPosition());
-		}
-		
-		return (ITextRegion[]) regionPath.toArray(new ITextRegion[0]);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.java
deleted file mode 100644
index cb63630..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-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.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * 
- * @author cbateman
- *
- */
-/*package*/ class WorkspaceContextResolver implements IWorkspaceContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-	
-	/*package*/WorkspaceContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver#getProject()
-	 */
-	public IProject getProject() 
-	{
-		// copied from ModelManagerImpl (with some rework by C.B.)
-		final String path = getPath();
-		
-		if (path == null)
-		{
-			return null;
-		}
-		
-		// TOODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IPath iPath = new Path(path);
-		if (iPath.isAbsolute())
-		{
-			String  projectName = iPath.segment(0);
-			
-			IProject projects[] =  root.getProjects();
-			
-			for (int i = 0; i < projects.length; i++)
-			{
-				IProject project = projects[i];
-				
-				if (project.isOpen()
-						&& projectName.equals(project.getFullPath().segment(0)))
-				{
-					return project;  //
-				}
-			}
-		}
-
-		return null;
-	}
-
-	public IResource getResource() 
-	{
-		IProject project = getProject();
-		
-		if (project != null)
-		{
-			final String path = getPath();
-			
-			if (path != null)
-			{
-				final IPath iPath = new Path(path);
-				if (iPath.isAbsolute())
-				{
-					return project.getFile(iPath.removeFirstSegments(1));
-				}
-			}
-		}
-		return null;
-	}
-	
-	private String getPath()
-	{
-		IStructuredModel model = null;
-		
-		try
-		{
-			model = StructuredModelManager.getModelManager().getExistingModelForRead(_context.getStructuredDocument());
-			
-			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();
-			}
-			
-			return path;
-		}
-		finally
-		{
-			if (model != null)
-			{
-				model.releaseFromRead();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/package-info.java
deleted file mode 100644
index 5389821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/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
- *    
- ********************************************************************************/
-
-/**
- * Context resolvers for contexts based on SSE structured documents.  
- */
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java
deleted file mode 100644
index b431d48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java
+++ /dev/null
@@ -1,41 +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.context.structureddocument;
-
-import org.eclipse.jst.jsf.context.AbstractDocumentContext;
-
-/**
- * A convenience abstract super-class for context implementing
- * the IStructuredDocumentContext interface
- * 
- * Class may be sub-classed by clients
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractStructuredDocumentContext extends AbstractDocumentContext
-				implements IStructuredDocumentContext 
-{
-	/**
-	 * @see org.eclipse.jst.jsf.context.AbstractDocumentContext#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapterClass)
-	{
-		if (adapterClass.equals(IStructuredDocumentContext.class))
-		{
-			return this;
-		}
-
-		return super.getAdapter(adapterClass);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.java
deleted file mode 100644
index 054fc71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.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.context.structureddocument;
-
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-
-/**
- * Abstract implementation of IStructuredDocumentContextFactory that must be used
- * by all implementers of new factories for document contexts.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractStructuredDocumentContextFactory extends AbstractDelegatingFactory {
-
-    /**
-     * @param supportedDelegateTypes
-     */
-    protected AbstractStructuredDocumentContextFactory(Class[] supportedDelegateTypes)
-    {
-        super(supportedDelegateTypes);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java
deleted file mode 100644
index 2cf5328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java
+++ /dev/null
@@ -1,37 +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.context.structureddocument;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.IDocumentContext;
-
-/**
- * Encapsulates runtime context in an SSE IStructuredDocument
- * @author cbateman
- *
- * Interface must NOT be implemented by clients.
- * Implementers should sub-class AbstractStructuredDocumentContext
- *
- */
-public interface IStructuredDocumentContext extends IDocumentContext
-{
-	/**
-	 * @return the text viewer whose context we are in
-	 */
-	IDocument getStructuredDocument();
-	/**
-	 * @return the document position within the text viewer's context
-	 * where we are.
-	 */
-	int getDocumentPosition();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.java
deleted file mode 100644
index d9412dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsf.context.structureddocument.internal.impl.StructuredDocumentContextFactory;
-import org.w3c.dom.Node;
-
-
-/**
- * A factory method for constructing context objects related to
- * SSE structured documents.
- *
- * May be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentContextFactory
-{
-	/**
-	 * The default singleton instance of the factory
-	 */
-	public static final IStructuredDocumentContextFactory  INSTANCE = 
-        StructuredDocumentContextFactory.getInstance();
-	
-	/**
-	 * 
-	 * @param textViewer -- the text viewer where the context exists
-	 * @param documentPosition -- the absolute position of the context relative to textViewer
-	 * @return a context for a given text viewer and document position within the
-	 * document model of that text viewer or null if one cannot be determined.
-	 */
-	IStructuredDocumentContext getContext(ITextViewer textViewer, int documentPosition);
-	
-	/**
-	 * @param document -- the document
-	 * @param documentPosition -- the absolute position of the context relative to the document
-	 * @return a context for the document model or null if one cannot be determined
-	 */
-	IStructuredDocumentContext getContext(IDocument document, int documentPosition);
-    
-    /**
-     * @param document -- the document model
-     * @param node -- the DOM node within the document
-     * @return a context for the document model and dom node or null if one cannot
-     * be determined
-     */
-    IStructuredDocumentContext getContext(IDocument document, Node node);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory2.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory2.java
deleted file mode 100644
index 6e77741..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory2.java
+++ /dev/null
@@ -1,38 +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.jsf.context.structureddocument;
-
-import org.eclipse.jst.jsf.context.structureddocument.internal.impl.StructuredDocumentContextFactory;
-import org.w3c.dom.Element;
-
-/**
- * A factory method for constructing context objects related to
- * SSE structured documents.  
- *
- * May be sub-classed or implemented by clients
- * 
- */
-public interface IStructuredDocumentContextFactory2 extends
-		IStructuredDocumentContextFactory {
-	
-	/**
-	 * The default singleton instance of the factory
-	 */
-	public static final IStructuredDocumentContextFactory2  INSTANCE = 
-        StructuredDocumentContextFactory.getInstance();
-	
-	/**
-	 * @param element -- org.w3c.Element 
-	 * @return a context for the element or if null if one cannot be determined.
-	 */
-	IStructuredDocumentContext getContext(Element element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java
deleted file mode 100644
index f4526e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java
+++ /dev/null
@@ -1,39 +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.context.structureddocument.internal.impl;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.structureddocument.AbstractStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/*package*/ class DefaultStructuredDocumentContext extends AbstractStructuredDocumentContext
-{
-	private final IStructuredDocument		_structuredDocument;
-	private final int						_documentPosition;
-	
-	/*package*/ DefaultStructuredDocumentContext(IStructuredDocument structuredDocument, int documentPosition)
-	{
-		_structuredDocument = structuredDocument;
-		_documentPosition = documentPosition;
-	}
-
-	public int getDocumentPosition() 
-	{
-		return _documentPosition;
-	}
-
-	public IDocument getStructuredDocument()
-	{
-		return _structuredDocument;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java
deleted file mode 100644
index 89f24f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java
+++ /dev/null
@@ -1,270 +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.context.structureddocument.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsf.context.structureddocument.AbstractStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- */
-public class StructuredDocumentContextFactory extends AbstractStructuredDocumentContextFactory
-			 implements IStructuredDocumentContextFactory, IStructuredDocumentContextFactory2
-{
-	/* static attributes */
-	private static StructuredDocumentContextFactory  INSTANCE;
-
-	/**
-	 * @param supportedDelegateTypes
-	 */
-	public StructuredDocumentContextFactory(Class[]  supportedDelegateTypes)
-	{
-	    super(supportedDelegateTypes);
-	}
-	
-	/**
-	 * @return an instance (possibly shared) of the this factory
-	 */
-	public synchronized static StructuredDocumentContextFactory getInstance()
-	{
-		if (INSTANCE == null)
-		{
-			INSTANCE = new StructuredDocumentContextFactory();
-		}
-		
-		return INSTANCE;
-	}
-	
-	
-	/**
-	 * Construct the factory
-	 */
-	protected StructuredDocumentContextFactory()
-	{
-		super(new Class[] {IStructuredDocumentContextFactory.class});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public final IStructuredDocumentContext getContext(ITextViewer textViewer, int documentPosition) 
-	{
-		// first see if I know how to make one
-		IStructuredDocumentContext  context = internalGetContext(textViewer, documentPosition);
-		
-		// if I don't know, ask my delegates
-		if (context == null)
-		{
-			context = delegateGetContext(textViewer, documentPosition);
-		}
-		
-		return context;
-	}
-
-	private IStructuredDocumentContext internalGetContext(ITextViewer textViewer, int documentPosition)
-	{
-		if (textViewer instanceof StructuredTextViewer)
-		{
-			IDocument document = ((StructuredTextViewer)textViewer).getDocument();
-			return internalGetContext(document, documentPosition);
-		}
-		
-		return null;
-	}
-	
-	private IStructuredDocumentContext internalGetContext(IDocument document, int documentPosition)
-	{
-		if (document instanceof IStructuredDocument)
-		{
-			return new DefaultStructuredDocumentContext((IStructuredDocument)document, documentPosition);
-		}
-		
-		return null;
-	}
-	
-	private IStructuredDocumentContext delegateGetContext(ITextViewer textViewer, int documentPosition)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				IStructuredDocumentContext context = delegateFactory.getContext(textViewer, documentPosition);
-				
-				if (context != null)
-				{
-					return context;
-				}
-			}
-			
-			return null;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.IDocument, int)
-	 */
-	public IStructuredDocumentContext getContext(IDocument document, int documentPosition) {
-		// first see if I know how to make one
-		IStructuredDocumentContext  context = internalGetContext(document, documentPosition);
-		
-		// if I don't know, ask my delegates
-		if (context == null)
-		{
-			context = delegateGetContext(document, documentPosition);
-		}
-		
-		return context;
-	}
-	
-	private IStructuredDocumentContext delegateGetContext(IDocument document, int documentPosition)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				IStructuredDocumentContext context = delegateFactory.getContext(document, documentPosition);
-				
-				if (context != null)
-				{
-					return context;
-				}
-			}
-			
-			return null;
-		}
-	}
-
-    public IStructuredDocumentContext getContext(IDocument document, Node node) 
-    {
-        // first see if I know how to make one
-        IStructuredDocumentContext  context = internalGetContext(document, node);
-        
-        // if I don't know, ask my delegates
-        if (context == null)
-        {
-            context = delegateGetContext(document, node);
-        }
-        
-        return context;
-
-    }
-    
-
-
-	private IStructuredDocumentContext internalGetContext(IDocument document, Node node)
-    {
-        if (document instanceof IStructuredDocument)
-        {
-            final IStructuredDocument sDoc = (IStructuredDocument) document;
-            if (node instanceof IndexedRegion)
-            {
-                final int position = ((IndexedRegion)node).getStartOffset();
-                return new DefaultStructuredDocumentContext(sDoc, position);
-            }
-            else if (node instanceof IDOMAttr)
-            {
-                IDOMAttr  attr = (IDOMAttr) node;
-                final int position = attr.getValueRegionStartOffset();
-                return new DefaultStructuredDocumentContext(sDoc, position);
-            }
-        }
-        
-        return null;
-    }
-    
-    private IStructuredDocumentContext delegateGetContext(IDocument document, Node node)
-    {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-                IStructuredDocumentContext context = delegateFactory.getContext(document, node);
-                
-                if (context != null)
-                {
-                    return context;
-                }
-            }
-            
-            return null;
-        }
-    }
-    
-    public IStructuredDocumentContext getContext(Element element) 
-    {
-        // first see if I know how to make one
-        IStructuredDocumentContext  context = internalGetContext(element);
-        
-        // if I don't know, ask my delegates
-        if (context == null)
-        {
-            context = delegateGetContext(element);
-        }
-        
-        return context;
-
-    }
-    
-	private IStructuredDocumentContext internalGetContext(Element element) {
-		if (element instanceof IDOMNode){
-			final IDOMNode node = (IDOMNode)element;
-			final IStructuredDocument sDoc = node.getStructuredDocument();
-            final int position = node.getStartOffset();
-            
-            return new DefaultStructuredDocumentContext(sDoc, position);            
-        }
-		
-		return null;
-	}
-	
-    private IStructuredDocumentContext delegateGetContext(Element element) {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                IStructuredDocumentContextFactory2 delegateFactory = (IStructuredDocumentContextFactory2) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory2.class);
-                if (delegateFactory != null)
-                {
-	                IStructuredDocumentContext context = delegateFactory.getContext(element);
-	                
-	                if (context != null)
-	                {
-	                    return context;
-	                }
-                }
-            }
-            
-            return null;
-        }
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/package-info.java
deleted file mode 100644
index cc51534..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/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 for SSE structured documents.  
- */
-package org.eclipse.jst.jsf.context.structureddocument;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java
deleted file mode 100644
index 902e20d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java
+++ /dev/null
@@ -1,236 +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.context.symbol;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * Enumerates the possible sources of an instance symbol
- * at runtime.  In the default implementation these can
- * be: from the built-in variables, from the managed bean
- * facility, and those defined in tags.  This information
- * is provided to allow the VariableResolver to resolve
- * conflicts when instance symbols come from more than one
- * source. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getERuntimeSource()
- * @model
- * @generated
- */
-public final class ERuntimeSource extends AbstractEnumerator {
-    /**
-     * @generated NOT
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The '<em><b>BUILT IN SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>BUILT IN SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #BUILT_IN_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int BUILT_IN_SYMBOL = 0;
-
-    /**
-     * The '<em><b>MANAGED BEAN SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>MANAGED BEAN SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #MANAGED_BEAN_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int MANAGED_BEAN_SYMBOL = 1;
-
-    /**
-     * The '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #TAG_INSTANTIATED_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int TAG_INSTANTIATED_SYMBOL = 2;
-
-    /**
-     * The '<em><b>OTHER</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>OTHER</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #OTHER_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int OTHER = 3;
-
-    /**
-     * The '<em><b>BUILT IN SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #BUILT_IN_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource BUILT_IN_SYMBOL_LITERAL = new ERuntimeSource(BUILT_IN_SYMBOL, "BUILT_IN_SYMBOL", "BUILT_IN_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>MANAGED BEAN SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #MANAGED_BEAN_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource MANAGED_BEAN_SYMBOL_LITERAL = new ERuntimeSource(MANAGED_BEAN_SYMBOL, "MANAGED_BEAN_SYMBOL", "MANAGED_BEAN_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #TAG_INSTANTIATED_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource TAG_INSTANTIATED_SYMBOL_LITERAL = new ERuntimeSource(TAG_INSTANTIATED_SYMBOL, "TAG_INSTANTIATED_SYMBOL", "TAG_INSTANTIATED_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>OTHER</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #OTHER
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource OTHER_LITERAL = new ERuntimeSource(OTHER, "OTHER", "OTHER"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * An array of all the '<em><b>ERuntime Source</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final ERuntimeSource[] VALUES_ARRAY =
-        new ERuntimeSource[] {
-            BUILT_IN_SYMBOL_LITERAL,
-            MANAGED_BEAN_SYMBOL_LITERAL,
-            TAG_INSTANTIATED_SYMBOL_LITERAL,
-            OTHER_LITERAL,
-        };
-
-    /**
-     * A public read-only list of all the '<em><b>ERuntime Source</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>ERuntime Source</b></em>' literal with the specified literal value.
-     * <!-- begin-user-doc -->
-     * @param literal 
-     * @return the enumeration for a string literal representation 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource get(String literal) {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-            ERuntimeSource result = VALUES_ARRAY[i];
-            if (result.toString().equals(literal)) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>ERuntime Source</b></em>' literal with the specified name.
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @return the enumeration for the name of the literal value 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource getByName(String name) {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-            ERuntimeSource result = VALUES_ARRAY[i];
-            if (result.getName().equals(name)) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>ERuntime Source</b></em>' literal with the specified integer value.
-     * <!-- begin-user-doc -->
-     * @param value 
-     * @return the enumeration for it's integral value 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource get(int value) {
-        switch (value) {
-            case BUILT_IN_SYMBOL: return BUILT_IN_SYMBOL_LITERAL;
-            case MANAGED_BEAN_SYMBOL: return MANAGED_BEAN_SYMBOL_LITERAL;
-            case TAG_INSTANTIATED_SYMBOL: return TAG_INSTANTIATED_SYMBOL_LITERAL;
-            case OTHER: return OTHER_LITERAL;
-        }
-        return null;	
-    }
-
-    /**
-     * Only this class can construct instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private ERuntimeSource(int value, String name, String literal) {
-        super(value, name, literal);
-    }
-
-} //ERuntimeSource
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java
deleted file mode 100644
index a1ddd36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java
+++ /dev/null
@@ -1,88 +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.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * An instance of a java bean
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * 
- * @author cbateman
- * @model
- */
-public interface IBeanInstanceSymbol extends IInstanceSymbol, IDescribedInDetail {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Properties</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>Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanInstanceSymbol_Properties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" changeable="false" volatile="true"
-     * @generated
-     */
-	EList getProperties();
-
-    /**
-     * Returns the value of the '<em><b>Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Methods</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>Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanInstanceSymbol_Methods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol" changeable="false" volatile="true"
-     * @generated
-     */
-	EList getMethods();
-
-    /**
-     * <!-- begin-user-doc -->
-     * This is a convenience method equivalent to to (IJavaTypeDescriptor2) getTypeDescriptor
-     * @return the type descriptor cast to a java descriptor
-     * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-    IJavaTypeDescriptor2 getJavaTypeDescriptor();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Convenience method equivalent to setTypeDescriptor((IJavaTypeDescriptor2) typeDesc)s
-     * @param newTypeDescriptor 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    void setJavaTypeDescriptor(IJavaTypeDescriptor2 newTypeDescriptor);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java
deleted file mode 100644
index 271a936..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java
+++ /dev/null
@@ -1,66 +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.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBean Method Symbol</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.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanMethodSymbol()
- * @model
- * @generated
- */
-public interface IBeanMethodSymbol extends IDescribedInDetail, IMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";   //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Owner</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Owner</em>' reference.
-     * @see #setOwner(IJavaTypeDescriptor2)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanMethodSymbol_Owner()
-     * @model
-     * @generated
-     */
-	IJavaTypeDescriptor2 getOwner();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Owner</em>' reference.
-     * @see #getOwner()
-     * @generated
-     */
-	void setOwner(IJavaTypeDescriptor2 value);
-
-} // IBeanMethodSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.java
deleted file mode 100644
index 3fb6f88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-/**
- * 
- * <!-- begin-user-doc -->
- * A property of a bean
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * 
- * @author cbateman
- * @model
- */
-public interface IBeanPropertySymbol extends IPropertySymbol, IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the bean that owns this property
-	 * @model
-	 */
-	IJavaTypeDescriptor2		getOwner();
-	
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Owner</em>' reference.
-     * @see #getOwner()
-     * @generated
-     */
-	void setOwner(IJavaTypeDescriptor2 value);
-
-	/**
-	 * @return true if the bean has getter for this property
-	 * @model
-	 */
-	boolean					isReadable();
-	
-	/**
-	 * @return true if the bean has a setter fot this property
-	 * @model
-	 */
-	boolean					isWritable();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java
deleted file mode 100644
index 7340267..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded Java Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedJavaTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedJavaTypeDescriptor extends IJavaTypeDescriptor2, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedJavaTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java
deleted file mode 100644
index ebd153c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded List Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedListTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedListTypeDescriptor extends IListTypeDescriptor, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedListTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java
deleted file mode 100644
index f54c12e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * Describes a IMapTypeDescriptor for which the possible keyed values are
- * unbounded for some set of possible value types.  For example, a managed
- * bean that implements Map, is unconstrained for all values in Java 1.4 and
- * for whatever the template value type is in Java5.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedMapTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedMapTypeDescriptor extends IMapTypeDescriptor, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedMapTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java
deleted file mode 100644
index ea92d5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedTypeDescriptor()
- * @model interface="true" abstract="true"
- * @generated
- */
-public interface IBoundedTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if this type can have unbounded property key for the
-     * indicated type.  For example, a Java 1.4 Map could potentially have
-     * a value of any time for a particular key, so this method would always return
-     * true.  However a Java5 Map<String, String> would only return true if 
-     * typeSignature is-a String.
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean isUnboundedForType(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @param typeSignature 
-     * @return a symbol corresponding to the property of this type desc
-     * with name called 'name' of type 'typeSignature'.  Must return null if
-     * isPropNameUnconstrainedForType returns false for 'typeSignature'.
-     * Generally should return something meaningful (even if just an
-     * object) when isPropNameUnconstrainedForType returns true.
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    ISymbol getUnboundedProperty(Object name, String typeSignature);
-
-} // IBoundedTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.java
deleted file mode 100644
index 7cad1c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IComponent Symbol</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIComponentSymbol()
- * @model
- * @generated
- */
-public interface IComponentSymbol extends IInstanceSymbol, IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IComponentSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.java
deleted file mode 100644
index 9fb2818..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.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.context.symbol;
-
-
-/** 
- * Tags a symbol that has a detailed, user-readable description
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->s
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the detailed description
-	 * @model
-	 */
-	String  getDetailedDescription();
-	
-	/**
-	 * @param detailedDescription
-	 * @model
-	 */
-	void setDetailedDescription(String detailedDescription);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.java
deleted file mode 100644
index d1e883d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-/**
- * <!-- begin-user-doc -->
- * A symbol that represents an instance of something, typically
- * a variable.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface IInstanceSymbol extends IObjectSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the type descriptor for this instance
-	 * @model
-	 */
-	ITypeDescriptor	getTypeDescriptor();
-    /**
-     * Returns the value of the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type Resolved</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 Resolved</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIInstanceSymbol_TypeResolved()
-     * @model changeable="false" volatile="true"
-     * @generated
-     */
-	boolean isTypeResolved();
-
-    /**
-     * Returns the value of the '<em><b>Runtime Source</b></em>' attribute.
-     * The default value is <code>"TAG_INSTANTIATED_SYMBOL"</code>.
-     * The literals are from the enumeration {@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Runtime 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>Runtime Source</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see #setRuntimeSource(ERuntimeSource)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIInstanceSymbol_RuntimeSource()
-     * @model default="TAG_INSTANTIATED_SYMBOL"
-     * @generated
-     */
-    ERuntimeSource getRuntimeSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Runtime Source</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see #getRuntimeSource()
-     * @generated
-     */
-    void setRuntimeSource(ERuntimeSource value);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java
deleted file mode 100644
index fa167ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java
+++ /dev/null
@@ -1,57 +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.context.symbol;
-
-import org.eclipse.jdt.core.IJavaElement;
-
-/**
- * <!-- begin-user-doc -->
- * Represents a symbol that has meaning within Java's context.  This may
- * be the name of a type, an instance, method etc.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface IJavaSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * A IJavaElement may not exist for a symbol if it is synthetic at
-	 * design time but will be bound to a Java symbol at runtime.  An
-	 * example is a managed bean instance in JSF.  JDT can provide no
-	 * design-time meta-data for the symbol because it won't have 
-	 * a Java representation until the containing JSP is compiled.
-	 * 
-	 * @return JDT's java element for this symbol or null if one doesn't
-	 * exist.
-	 * @model
-	 */
-	IJavaElement  getJavaElement();
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Java Element</em>' attribute.
-     * @see #getJavaElement()
-     * @generated
-     */
-	void setJavaElement(IJavaElement value);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java
deleted file mode 100644
index 1919289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java
+++ /dev/null
@@ -1,144 +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.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IType;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IJava Type Descriptor2</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.jsf.context.symbol.IJavaTypeDescriptor2#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties <em>Bean Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods <em>Bean Methods</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2()
- * @model
- * @generated
- */
-public interface IJavaTypeDescriptor2 extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Type</b></em>' attribute.
-     * <!-- 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 #setType(IType)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_Type()
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-	IType getType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#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(IType value);
-
-    /**
-     * Returns the value of the '<em><b>Bean Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bean Properties</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>Bean Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_BeanProperties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" volatile="true"
-     * @generated
-     */
-	EList getBeanProperties();
-
-    /**
-     * Returns the value of the '<em><b>Bean Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bean Methods</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>Bean Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_BeanMethods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" volatile="true"
-     * @generated
-     */
-	EList getBeanMethods();
-
-    /**
-     * Returns the value of the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Array Count</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Array Count</em>' attribute.
-     * @see #setArrayCount(int)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_ArrayCount()
-     * @model
-     * @generated
-     */
-    int getArrayCount();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * records the array nesting of the type.  IType doesn't encapsulate
-     * array types. So if this type is an array then type will represent
-     * the base element and this value will be > 0.  If not an array, then
-     * _arrayCount is always 0. 
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Array Count</em>' attribute.
-     * @see #getArrayCount()
-     * @generated
-     */
-    void setArrayCount(int value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param resolvedTypeSignature 
-     * @return the resolved type or null. 
-     * <!-- end-user-doc -->
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-    IType resolveType(String resolvedTypeSignature);
-
-} // IJavaTypeDescriptor2
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java
deleted file mode 100644
index c4b4586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IList Type Descriptor</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.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIListTypeDescriptor()
- * @model
- * @generated
- */
-public interface IListTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>List 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>List Source</em>' attribute.
-     * @see #setListSource(EList)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIListTypeDescriptor_ListSource()
-     * @model many="false"
-     * @generated
-     */
-    EList getListSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>List Source</em>' attribute.
-     * @see #getListSource()
-     * @generated
-     */
-    void setListSource(EList value);
-
-} // IListTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java
deleted file mode 100644
index d991b72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java
+++ /dev/null
@@ -1,96 +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.context.symbol;
-
-import java.util.Map;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IMap Type Descriptor</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.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor()
- * @model
- * @generated
- */
-public interface IMapTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Map 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>Map Source</em>' attribute.
-     * @see #setMapSource(Map)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor_MapSource()
-     * @model
-     * @generated
-     */
-    Map getMapSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Source</em>' attribute.
-     * @see #getMapSource()
-     * @generated
-     */
-    void setMapSource(Map value);
-
-    /**
-     * Returns the value of the '<em><b>Immutable</b></em>' attribute.
-     * The default value is <code>"true"</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Immutable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Immutable</em>' attribute.
-     * @see #setImmutable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor_Immutable()
-     * @model default="true"
-     * @generated
-     */
-    boolean isImmutable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Immutable</em>' attribute.
-     * @see #isImmutable()
-     * @generated
-     */
-    void setImmutable(boolean value);
-
-} // IMapTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.java
deleted file mode 100644
index 45ee82c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IMethod Symbol</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.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMethodSymbol()
- * @model
- * @generated
- */
-public interface IMethodSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>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>Signature</em>' attribute.
-     * @see #setSignature(String)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMethodSymbol_Signature()
-     * @model
-     * @generated
-     */
-    String getSignature();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Signature</em>' attribute.
-     * @see #getSignature()
-     * @generated
-     */
-    void setSignature(String value);
-
-} // IMethodSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.java
deleted file mode 100644
index 34fee43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IObject Symbol</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.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol()
- * @model interface="true" abstract="true"
- * @generated
- */
-public interface IObjectSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Descriptor</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 Descriptor</em>' reference.
-     * @see #setTypeDescriptor(ITypeDescriptor)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_TypeDescriptor()
-     * @model
-     * @generated
-     */
-    ITypeDescriptor getTypeDescriptor();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Descriptor</em>' reference.
-     * @see #getTypeDescriptor()
-     * @generated
-     */
-    void setTypeDescriptor(ITypeDescriptor value);
-
-    /**
-     * Returns the value of the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Readable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Readable</em>' attribute.
-     * @see #setReadable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_Readable()
-     * @model
-     * @generated
-     */
-    boolean isReadable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Readable</em>' attribute.
-     * @see #isReadable()
-     * @generated
-     */
-    void setReadable(boolean value);
-
-    /**
-     * Returns the value of the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Writable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Writable</em>' attribute.
-     * @see #setWritable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_Writable()
-     * @model
-     * @generated
-     */
-    boolean isWritable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Writable</em>' attribute.
-     * @see #isWritable()
-     * @generated
-     */
-    void setWritable(boolean value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if this object can be coerced (is an instanceof) the type
-     * specified in the fully qualified typeSignature 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean supportsCoercion(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return a type descriptor supporting a class cast of this object to
-     * the request typeSignature, or null if such a cast is not supported.
-     * Returns non-null iff supportsCoercion(typeSignature) == false
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    ITypeDescriptor coerce(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param methodName 
-     * @param methodArguments 
-     * @param symbolName 
-     * @return a symbol resulting from calling the call or null if can't be determined.
-     * Generally, the symbolName should be used for the getName() value of the returned
-     * symbol, although implementers are not bound to this if a more meaningful value
-     * can be calculated.
-     * <!-- end-user-doc -->
-     * @model methodArgumentsType="org.eclipse.jst.jsf.common.internal.types.ValueType" methodArgumentsDataType="org.eclipse.jst.jsf.context.symbol.ValueType" methodArgumentsMany="true"
-     * @generated
-     */
-    ISymbol call(String methodName, EList methodArguments, String symbolName);
-
-} // IObjectSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.java
deleted file mode 100644
index ea757ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IProperty Symbol</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.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIPropertySymbol()
- * @model
- * @generated
- */
-public interface IPropertySymbol extends IObjectSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Intermediate</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Intermediate</em>' attribute.
-     * @see #setIntermediate(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIPropertySymbol_Intermediate()
-     * @model
-     * @generated
-     */
-    boolean isIntermediate();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Intermediate</em>' attribute.
-     * @see #isIntermediate()
-     * @generated
-     */
-    void setIntermediate(boolean value);
-
-} // IPropertySymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.java
deleted file mode 100644
index 20a56c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.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.context.symbol;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * An entity that represents a meaningful named value in some context. 
- * Typically these represent programming language variables, properties and methods.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface ISymbol extends EObject {
-    /**
-     * Singleton for an empty array of ISymbols
-     */
-    final ISymbol[]         EMPTY_SYMBOL_ARRAY = new ISymbol[0];
-    
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the symbol's name
-	 * @model
-	 */
-	String getName();
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol#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);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java
deleted file mode 100644
index 4be180f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java
+++ /dev/null
@@ -1,264 +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.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-
-/**
- * <!-- begin-user-doc -->
- * A generic descriptor for symbol information
- *
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface ITypeDescriptor extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Properties</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>Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_Properties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IPropertySymbol" volatile="true"
-     * @generated
-     */
-    EList getProperties();
-
-    /**
-     * Returns the value of the '<em><b>Type Signature</b></em>' attribute.
-     * The default value is <code>""</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type 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>Type Signature</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeSignature()
-     * @model default="" changeable="false" volatile="true"
-     * @generated
-     */
-    String getTypeSignature();
-
-    /**
-     * Returns the value of the '<em><b>Super Type Signatures</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 Type Signatures</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 Type Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_SuperTypeSignatures()
-     * @model type="java.lang.String" volatile="true"
-     * @generated
-     */
-    EList getSuperTypeSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Interface Type Signatures</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>Interface Type Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_InterfaceTypeSignatures()
-     * @model type="java.lang.String" volatile="true"
-     * @generated
-     */
-    EList getInterfaceTypeSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Signature Delegate</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 Signature Delegate</em>' attribute.
-     * @see #setTypeSignatureDelegate(String)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeSignatureDelegate()
-     * @model
-     * @generated
-     */
-    String getTypeSignatureDelegate();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Signature Delegate</em>' attribute.
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     */
-    void setTypeSignatureDelegate(String value);
-
-    /**
-     * Returns the value of the '<em><b>Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Methods</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>Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_Methods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IMethodSymbol" volatile="true"
-     * @generated
-     */
-    EList getMethods();
-
-    /**
-     * Returns the value of the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Parameter Signatures</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>Type Parameter Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeParameterSignatures()
-     * @model type="java.lang.String" unique="false" transient="true"
-     * @generated
-     */
-    EList getTypeParameterSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Jdt Context</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Jdt Context</em>' attribute.
-     * @see #setJdtContext(IJavaElement)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_JdtContext()
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IJavaElement"
-     * @generated
-     */
-    IJavaElement getJdtContext();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Jdt Context</em>' attribute.
-     * @see #getJdtContext()
-     * @generated
-     */
-    void setJdtContext(IJavaElement value);
-
-    /**
-     * Returns the value of the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Enum 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>Enum Type</em>' attribute.
-     * @see #setEnumType(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_EnumType()
-     * @model
-     * @generated
-     */
-    boolean isEnumType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Enum Type</em>' attribute.
-     * @see #isEnumType()
-     * @generated
-     */
-    void setEnumType(boolean value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if the type descriptor's underlying type would resolve true == (type instanceof typeSignature)
-     * 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean instanceOf(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true iff this type is an array of something 
-	 * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-	boolean isArray();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a symbol representing an element of this array.  May
-     * throw an exception or return null if isArray() == false 
-	 * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-	IObjectSymbol getArrayElement();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param resolvedTypeSignature 
-     * @return the IType for resolvedTypeSignature or null if  can't be resolved 
-     * <!-- end-user-doc -->
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-    IType resolveType(String resolvedTypeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param methodName 
-     * @param methodArgs 
-     * @param symbolName 
-     * @return a symbol or null if not handling 
-     * <!-- end-user-doc -->
-     * @model methodArgsType="java.lang.String" methodArgsMany="true"
-     * @generated
-     */
-    ISymbol calculateSyntheticCall(String methodName, EList methodArgs, String symbolName);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/InitializedSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/InitializedSymbolFactory.java
deleted file mode 100644
index 60451c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/InitializedSymbolFactory.java
+++ /dev/null
@@ -1,241 +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.
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import org.eclipse.core.resources.IProject;
-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.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;
-
-/**
- * Creates purpose-built symbols and descriptors fully initialized (unlike the
- * EMF factory that simply creates empty instances.
- * 
- * This class is for convenience only and should not do anything that clients
- * could not do by hand (though with more work).
- * 
- * Clients may use or subclass.
- * 
- * @author cbateman
- * 
- */
-public class InitializedSymbolFactory
-{
-    /**
-     * If fullyQualifiedClass can be resolved to an IType, then a bean instance
-     * symbol will be created. If the type cannot be resolved, then
-     * createUnknownInstanceSymbol is called with the type descriptor on the
-     * returned symbol forced to fullyQualifiedClass.
-     * 
-     * @param project
-     * @param fullyQualifiedClass
-     * @param symbolName
-     * @param source
-     * @return a symbol
-     */
-    public final ISymbol createBeanOrUnknownInstanceSymbol(
-            final IProject project, final String fullyQualifiedClass,
-            final String symbolName, final ERuntimeSource source)
-    {
-        final IJavaProject javaProject = JavaCore.create(project);
-        try
-        {
-            final IType type = javaProject.findType(fullyQualifiedClass);
-
-            // TODO: this is a high-bred since it consists of a java instance
-            // but also has properties we can populate at designtime such as
-            // the maps. Need to add the second part
-            if (type != null)
-            {
-                final IJavaTypeDescriptor2 typeDesc = SymbolFactory.eINSTANCE
-                        .createIJavaTypeDescriptor2();
-                typeDesc.setType(type);
-                final IBeanInstanceSymbol facesContextVar = SymbolFactory.eINSTANCE
-                        .createIBeanInstanceSymbol();
-                facesContextVar.setTypeDescriptor(typeDesc);
-                facesContextVar.setName(symbolName);
-                facesContextVar.setRuntimeSource(source);
-                return facesContextVar;
-            }
-        }
-        catch (final JavaModelException jme)
-        {
-            // fall-through and fail with unresolved map
-        }
-
-        final ISymbol symbol = createUnknownInstanceSymbol(symbolName, source);
-        ((IInstanceSymbol) symbol)
-                .getTypeDescriptor()
-                .setTypeSignatureDelegate(
-                        Signature
-                                .createTypeSignature(fullyQualifiedClass, true));
-
-        return symbol;
-    }
-
-    /**
-     * @param symbolName
-     * @param source
-     * @return a symbol for a variable of unknown type
-     */
-    public final IComponentSymbol createUnknownComponentSymbol(
-            final String symbolName, final ERuntimeSource source)
-    {
-        final IComponentSymbol symbol = SymbolFactory.eINSTANCE
-                .createIComponentSymbol();
-        populateUnknownInstanceSymbol(symbol, symbolName, source);
-        return symbol;
-    }
-
-    /**
-     * @param symbolName
-     * @param source
-     * @return the unknown instance symbol as an IInstanceSymbol
-     */
-    public final IInstanceSymbol createUnknownInstanceSymbol(
-            final String symbolName, final ERuntimeSource source)
-    {
-        final IInstanceSymbol symbol = SymbolFactory.eINSTANCE
-                .createIInstanceSymbol();
-        populateUnknownInstanceSymbol(symbol, symbolName, source);
-        return symbol;
-    }
-
-    /**
-     * @param name
-     *            may NOT be null.
-     * @param typeDesc
-     *            may NOT be null.
-     * @param description
-     *            may be null
-     * @return a component symbol using the java type descriptor
-     * @throws IllegalArgumentException
-     *             if non-null argument is null
-     */
-    public final IComponentSymbol createJavaComponentSymbol(final String name,
-            final IJavaTypeDescriptor2 typeDesc, final String description)
-    {
-        if (name == null || typeDesc == null)
-        {
-            throw new IllegalArgumentException(
-                    "name and typeDesc must not be null");
-        }
-
-        final IComponentSymbol symbol = SymbolFactory.eINSTANCE
-                .createIComponentSymbol();
-        symbol.setName(name);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setRuntimeSource(ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        return symbol;
-    }
-
-    /**
-     * @param name
-     * @param valueType
-     * @param description
-     * @param javaProject
-     * @return an IComponentSymbol that uses valueType to derive the type
-     * of its type descriptor
-     */
-    public final IComponentSymbol createJavaComponentSymbol(final String name,
-            final ValueType valueType, final String description,
-            final IJavaProject javaProject)
-    {
-        final IJavaTypeDescriptor2 typeDesc = createTypeDescriptorFromSignature(
-                valueType.getSignature(), javaProject);
-        return createJavaComponentSymbol(name, typeDesc, description);
-    }
-
-    private void populateUnknownInstanceSymbol(final IInstanceSymbol symbol,
-            final String symbolName, final ERuntimeSource source)
-    {
-        final IMapTypeDescriptor typeDesc = SymbolFactory.eINSTANCE
-                .createIBoundedMapTypeDescriptor();
-        // empty map source
-        typeDesc.setMapSource(Collections.emptyMap());
-        symbol.setName(symbolName);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setRuntimeSource(source);
-    }
-
-    /**
-     * @param type
-     * @return the signature of the element type of a collection/array,
-     *         <code>null</code>, if untyped Collection or no container type
-     *         at all.
-     */
-    public final String getElementSignatureFromContainerType(ValueType type)
-    {
-        if (type.isArray())
-        {
-            // TODO full signature
-            String signature = type.getSignature();
-            int arrayCount = Signature.getArrayCount(signature);
-            String elementSig = Signature.getElementType(signature);
-            return Signature.createArraySignature(elementSig, arrayCount - 1);
-        }
-        if (type.isInstanceOf(TypeConstants.TYPE_COLLECTION))
-        {
-            final String[] typeArguments = type.getTypeArguments();
-            if (typeArguments.length > 0)
-            {
-                return typeArguments[0];
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param signature
-     * @param javaProject
-     * @return a java type descriptor based on the fully qualified type
-     *         specified by signature using javaProject as the lookup classpath.
-     *         If the IType for signature cannot be found, the descriptor's
-     *         typeSignatureDelegate will be used.
-     */
-    public final IJavaTypeDescriptor2 createTypeDescriptorFromSignature(
-            final String signature, final IJavaProject javaProject)
-    {
-        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)));
-        return desc;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.java
deleted file mode 100644
index 830b296..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.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.context.symbol;
-
-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.jsf.context.symbol.SymbolPackage
- * @generated
- */
-public interface SymbolFactory extends EFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    SymbolFactory eINSTANCE = org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>IBean Instance Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Instance Symbol</em>'.
-     * @generated
-     */
-    IBeanInstanceSymbol createIBeanInstanceSymbol();
-
-    /**
-     * Returns a new object of class '<em>IBean Property Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Property Symbol</em>'.
-     * @generated
-     */
-    IBeanPropertySymbol createIBeanPropertySymbol();
-
-    /**
-     * Returns a new object of class '<em>IInstance Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IInstance Symbol</em>'.
-     * @generated
-     */
-    IInstanceSymbol createIInstanceSymbol();
-
-    /**
-     * Returns a new object of class '<em>IJava Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IJava Symbol</em>'.
-     * @generated
-     */
-    IJavaSymbol createIJavaSymbol();
-
-    /**
-     * Returns a new object of class '<em>IJava Type Descriptor2</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IJava Type Descriptor2</em>'.
-     * @generated
-     */
-    IJavaTypeDescriptor2 createIJavaTypeDescriptor2();
-
-    /**
-     * Returns a new object of class '<em>IBean Method Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Method Symbol</em>'.
-     * @generated
-     */
-    IBeanMethodSymbol createIBeanMethodSymbol();
-
-    /**
-     * Returns a new object of class '<em>IComponent Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IComponent Symbol</em>'.
-     * @generated
-     */
-    IComponentSymbol createIComponentSymbol();
-
-    /**
-     * Returns a new object of class '<em>IProperty Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IProperty Symbol</em>'.
-     * @generated
-     */
-    IPropertySymbol createIPropertySymbol();
-
-    /**
-     * Returns a new object of class '<em>IMap Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IMap Type Descriptor</em>'.
-     * @generated
-     */
-    IMapTypeDescriptor createIMapTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IMethod Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IMethod Symbol</em>'.
-     * @generated
-     */
-    IMethodSymbol createIMethodSymbol();
-
-    /**
-     * Returns a new object of class '<em>IBounded Map Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded Map Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedMapTypeDescriptor createIBoundedMapTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IBounded Java Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded Java Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedJavaTypeDescriptor createIBoundedJavaTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IList Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IList Type Descriptor</em>'.
-     * @generated
-     */
-    IListTypeDescriptor createIListTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IBounded List Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded List Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedListTypeDescriptor createIBoundedListTypeDescriptor();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    SymbolPackage getSymbolPackage();
-
-} //SymbolFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java
deleted file mode 100644
index 89df71e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java
+++ /dev/null
@@ -1,2674 +0,0 @@
-/**
- * Copyright 2006 Oracle
- *
- * $Id: SymbolPackage.java,v 1.9 2007/10/01 04:29:43 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-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>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolFactory
- * @model kind="package"
- * @generated
- */
-public interface SymbolPackage extends EPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";
-
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "symbol";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http:///org/eclipse/jst/jsf/context/symbol.ecore";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "org.eclipse.jst.jsf.context.symbol";
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    SymbolPackage eINSTANCE = org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getISymbol()
-     * @generated
-     */
-    int ISYMBOL = 4;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ISYMBOL__NAME = 0;
-
-    /**
-     * The number of structural features of the '<em>ISymbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ISYMBOL_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIObjectSymbol()
-     * @generated
-     */
-    int IOBJECT_SYMBOL = 13;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__TYPE_DESCRIPTOR = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__READABLE = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__WRITABLE = ISYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>IObject Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl <em>IInstance Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIInstanceSymbol()
-     * @generated
-     */
-    int IINSTANCE_SYMBOL = 2;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__NAME = IOBJECT_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__TYPE_DESCRIPTOR = IOBJECT_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__READABLE = IOBJECT_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__WRITABLE = IOBJECT_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__TYPE_RESOLVED = IOBJECT_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__RUNTIME_SOURCE = IOBJECT_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IInstance Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL_FEATURE_COUNT = IOBJECT_SYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl <em>IBean Instance Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanInstanceSymbol()
-     * @generated
-     */
-    int IBEAN_INSTANCE_SYMBOL = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__NAME = IINSTANCE_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__TYPE_DESCRIPTOR = IINSTANCE_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__READABLE = IINSTANCE_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__WRITABLE = IINSTANCE_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__TYPE_RESOLVED = IINSTANCE_SYMBOL__TYPE_RESOLVED;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__RUNTIME_SOURCE = IINSTANCE_SYMBOL__RUNTIME_SOURCE;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__PROPERTIES = IINSTANCE_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__METHODS = IINSTANCE_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IBean Instance Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL_FEATURE_COUNT = IINSTANCE_SYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl <em>IProperty Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIPropertySymbol()
-     * @generated
-     */
-    int IPROPERTY_SYMBOL = 10;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__NAME = IOBJECT_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__TYPE_DESCRIPTOR = IOBJECT_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__READABLE = IOBJECT_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__WRITABLE = IOBJECT_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__INTERMEDIATE = IOBJECT_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IProperty Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL_FEATURE_COUNT = IOBJECT_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl <em>IBean Property Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanPropertySymbol()
-     * @generated
-     */
-    int IBEAN_PROPERTY_SYMBOL = 1;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__NAME = IPROPERTY_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__TYPE_DESCRIPTOR = IPROPERTY_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__READABLE = IPROPERTY_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__WRITABLE = IPROPERTY_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__INTERMEDIATE = IPROPERTY_SYMBOL__INTERMEDIATE;
-
-    /**
-     * The feature id for the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__OWNER = IPROPERTY_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IBean Property Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL_FEATURE_COUNT = IPROPERTY_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl <em>IJava Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaSymbol()
-     * @generated
-     */
-    int IJAVA_SYMBOL = 3;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Java Element</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL__JAVA_ELEMENT = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IJava Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl <em>IType Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getITypeDescriptor()
-     * @generated
-     */
-    int ITYPE_DESCRIPTOR = 5;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__PROPERTIES = 0;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_SIGNATURE = 1;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = 2;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = 3;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = 4;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__METHODS = 5;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = 6;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__JDT_CONTEXT = 7;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__ENUM_TYPE = 8;
-
-    /**
-     * The number of structural features of the '<em>IType Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR_FEATURE_COUNT = 9;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIDescribedInDetail()
-     * @generated
-     */
-    int IDESCRIBED_IN_DETAIL = 6;
-
-    /**
-     * The number of structural features of the '<em>IDescribed In Detail</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDESCRIBED_IN_DETAIL_FEATURE_COUNT = 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl <em>IJava Type Descriptor2</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaTypeDescriptor2()
-     * @generated
-     */
-    int IJAVA_TYPE_DESCRIPTOR2 = 7;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Bean Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Bean Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS = ITYPE_DESCRIPTOR_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 3;
-
-    /**
-     * The number of structural features of the '<em>IJava Type Descriptor2</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl <em>IBean Method Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanMethodSymbol()
-     * @generated
-     */
-    int IBEAN_METHOD_SYMBOL = 8;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__NAME = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__SIGNATURE = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__OWNER = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>IBean Method Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL_FEATURE_COUNT = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl <em>IComponent Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIComponentSymbol()
-     * @generated
-     */
-    int ICOMPONENT_SYMBOL = 9;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__NAME = IINSTANCE_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__TYPE_DESCRIPTOR = IINSTANCE_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__READABLE = IINSTANCE_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__WRITABLE = IINSTANCE_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__TYPE_RESOLVED = IINSTANCE_SYMBOL__TYPE_RESOLVED;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__RUNTIME_SOURCE = IINSTANCE_SYMBOL__RUNTIME_SOURCE;
-
-    /**
-     * The number of structural features of the '<em>IComponent Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL_FEATURE_COUNT = IINSTANCE_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl <em>IMap Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMapTypeDescriptor()
-     * @generated
-     */
-    int IMAP_TYPE_DESCRIPTOR = 11;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__MAP_SOURCE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Immutable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__IMMUTABLE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IMap Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl <em>IMethod Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMethodSymbol()
-     * @generated
-     */
-    int IMETHOD_SYMBOL = 12;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL__SIGNATURE = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IMethod Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR = 14;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The number of structural features of the '<em>IBounded Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl <em>IBounded Map Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedMapTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR = 15;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__PROPERTIES = IMAP_TYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE = IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = IMAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = IMAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__METHODS = IMAP_TYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = IMAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__JDT_CONTEXT = IMAP_TYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__ENUM_TYPE = IMAP_TYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__MAP_SOURCE = IMAP_TYPE_DESCRIPTOR__MAP_SOURCE;
-
-    /**
-     * The feature id for the '<em><b>Immutable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__IMMUTABLE = IMAP_TYPE_DESCRIPTOR__IMMUTABLE;
-
-    /**
-     * The number of structural features of the '<em>IBounded Map Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR_FEATURE_COUNT = IMAP_TYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl <em>IBounded Java Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedJavaTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR = 16;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__PROPERTIES = IJAVA_TYPE_DESCRIPTOR2__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_SIGNATURE = IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__METHODS = IJAVA_TYPE_DESCRIPTOR2__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__JDT_CONTEXT = IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__ENUM_TYPE = IJAVA_TYPE_DESCRIPTOR2__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE = IJAVA_TYPE_DESCRIPTOR2__TYPE;
-
-    /**
-     * The feature id for the '<em><b>Bean Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__BEAN_PROPERTIES = IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Bean Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__BEAN_METHODS = IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS;
-
-    /**
-     * The feature id for the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__ARRAY_COUNT = IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT;
-
-    /**
-     * The number of structural features of the '<em>IBounded Java Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR_FEATURE_COUNT = IJAVA_TYPE_DESCRIPTOR2_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl <em>IList Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIListTypeDescriptor()
-     * @generated
-     */
-    int ILIST_TYPE_DESCRIPTOR = 17;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__LIST_SOURCE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IList Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl <em>IBounded List Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedListTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR = 18;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__PROPERTIES = ILIST_TYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ILIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ILIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__METHODS = ILIST_TYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ILIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__JDT_CONTEXT = ILIST_TYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__ENUM_TYPE = ILIST_TYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__LIST_SOURCE = ILIST_TYPE_DESCRIPTOR__LIST_SOURCE;
-
-    /**
-     * The number of structural features of the '<em>IBounded List Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR_FEATURE_COUNT = ILIST_TYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}' enum.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getERuntimeSource()
-     * @generated
-     */
-    int ERUNTIME_SOURCE = 19;
-
-    /**
-     * The meta object id for the '<em>IType</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jdt.core.IType
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIType()
-     * @generated
-     */
-    int ITYPE = 20;
-
-    /**
-     * The meta object id for the '<em>IJava Element</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jdt.core.IJavaElement
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaElement()
-     * @generated
-     */
-    int IJAVA_ELEMENT = 21;
-
-    /**
-     * The meta object id for the '<em>Value Type</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getValueType()
-     * @generated
-     */
-    int VALUE_TYPE = 22;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol <em>IBean Instance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Instance Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol
-     * @generated
-     */
-    EClass getIBeanInstanceSymbol();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getProperties <em>Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getProperties()
-     * @see #getIBeanInstanceSymbol()
-     * @generated
-     */
-    EReference getIBeanInstanceSymbol_Properties();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getMethods <em>Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getMethods()
-     * @see #getIBeanInstanceSymbol()
-     * @generated
-     */
-    EReference getIBeanInstanceSymbol_Methods();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol <em>IBean Property Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Property Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol
-     * @generated
-     */
-    EClass getIBeanPropertySymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner <em>Owner</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Owner</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner()
-     * @see #getIBeanPropertySymbol()
-     * @generated
-     */
-    EReference getIBeanPropertySymbol_Owner();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol <em>IInstance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IInstance Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol
-     * @generated
-     */
-    EClass getIInstanceSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#isTypeResolved <em>Type Resolved</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Resolved</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#isTypeResolved()
-     * @see #getIInstanceSymbol()
-     * @generated
-     */
-    EAttribute getIInstanceSymbol_TypeResolved();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource <em>Runtime Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Runtime Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource()
-     * @see #getIInstanceSymbol()
-     * @generated
-     */
-    EAttribute getIInstanceSymbol_RuntimeSource();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol <em>IJava Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IJava Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaSymbol
-     * @generated
-     */
-    EClass getIJavaSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement <em>Java Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Java Element</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement()
-     * @see #getIJavaSymbol()
-     * @generated
-     */
-    EAttribute getIJavaSymbol_JavaElement();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>ISymbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-     * @generated
-     */
-    EClass getISymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ISymbol#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.context.symbol.ISymbol#getName()
-     * @see #getISymbol()
-     * @generated
-     */
-    EAttribute getISymbol_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor <em>IType Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IType Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor
-     * @generated
-     */
-    EClass getITypeDescriptor();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getProperties <em>Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getProperties()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EReference getITypeDescriptor_Properties();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignature <em>Type Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Signature</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignature()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeSignature();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getSuperTypeSignatures <em>Super Type Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Super Type Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getSuperTypeSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_SuperTypeSignatures();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getInterfaceTypeSignatures <em>Interface Type Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Interface Type Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getInterfaceTypeSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_InterfaceTypeSignatures();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate <em>Type Signature Delegate</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Signature Delegate</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeSignatureDelegate();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getMethods <em>Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getMethods()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EReference getITypeDescriptor_Methods();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeParameterSignatures <em>Type Parameter Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Type Parameter Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeParameterSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeParameterSignatures();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext <em>Jdt Context</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Jdt Context</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_JdtContext();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType <em>Enum Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Enum Type</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_EnumType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IDescribed In Detail</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-     * @generated
-     */
-    EClass getIDescribedInDetail();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2 <em>IJava Type Descriptor2</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IJava Type Descriptor2</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2
-     * @generated
-     */
-    EClass getIJavaTypeDescriptor2();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#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.context.symbol.IJavaTypeDescriptor2#getType()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EAttribute getIJavaTypeDescriptor2_Type();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties <em>Bean Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Bean Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EReference getIJavaTypeDescriptor2_BeanProperties();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods <em>Bean Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Bean Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EReference getIJavaTypeDescriptor2_BeanMethods();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Array Count</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EAttribute getIJavaTypeDescriptor2_ArrayCount();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol <em>IBean Method Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Method Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol
-     * @generated
-     */
-    EClass getIBeanMethodSymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Owner</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner()
-     * @see #getIBeanMethodSymbol()
-     * @generated
-     */
-    EReference getIBeanMethodSymbol_Owner();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol <em>IComponent Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IComponent Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IComponentSymbol
-     * @generated
-     */
-    EClass getIComponentSymbol();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol <em>IProperty Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IProperty Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IPropertySymbol
-     * @generated
-     */
-    EClass getIPropertySymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Intermediate</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate()
-     * @see #getIPropertySymbol()
-     * @generated
-     */
-    EAttribute getIPropertySymbol_Intermediate();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor <em>IMap Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IMap Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor
-     * @generated
-     */
-    EClass getIMapTypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Map Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource()
-     * @see #getIMapTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIMapTypeDescriptor_MapSource();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Immutable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable()
-     * @see #getIMapTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIMapTypeDescriptor_Immutable();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol <em>IMethod Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IMethod Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMethodSymbol
-     * @generated
-     */
-    EClass getIMethodSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Signature</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature()
-     * @see #getIMethodSymbol()
-     * @generated
-     */
-    EAttribute getIMethodSymbol_Signature();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IObject Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-     * @generated
-     */
-    EClass getIObjectSymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EReference getIObjectSymbol_TypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Readable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EAttribute getIObjectSymbol_Readable();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Writable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EAttribute getIObjectSymbol_Writable();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor <em>IBounded Map Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Map Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedMapTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor <em>IBounded Java Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Java Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedJavaTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor <em>IList Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IList Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor
-     * @generated
-     */
-    EClass getIListTypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>List Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource()
-     * @see #getIListTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIListTypeDescriptor_ListSource();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor <em>IBounded List Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded List Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedListTypeDescriptor();
-
-    /**
-     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for enum '<em>ERuntime Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @generated
-     */
-    EEnum getERuntimeSource();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jdt.core.IType <em>IType</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>IType</em>'.
-     * @see org.eclipse.jdt.core.IType
-     * @model instanceClass="org.eclipse.jdt.core.IType"
-     * @generated
-     */
-    EDataType getIType();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jdt.core.IJavaElement <em>IJava Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>IJava Element</em>'.
-     * @see org.eclipse.jdt.core.IJavaElement
-     * @model instanceClass="org.eclipse.jdt.core.IJavaElement"
-     * @generated
-     */
-    EDataType getIJavaElement();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.internal.types.ValueType <em>Value Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Value Type</em>'.
-     * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-     * @model instanceClass="org.eclipse.jst.jsf.common.internal.types.ValueType"
-     * @generated
-     */
-    EDataType getValueType();
-
-    /**
-     * 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
-     */
-    SymbolFactory getSymbolFactory();
-
-    /**
-     * <!-- 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.context.symbol.internal.impl.IBeanInstanceSymbolImpl <em>IBean Instance Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanInstanceSymbol()
-         * @generated
-         */
-        EClass IBEAN_INSTANCE_SYMBOL = eINSTANCE.getIBeanInstanceSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-		EReference IBEAN_INSTANCE_SYMBOL__PROPERTIES = eINSTANCE.getIBeanInstanceSymbol_Properties();
-
-        /**
-         * The meta object literal for the '<em><b>Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_INSTANCE_SYMBOL__METHODS = eINSTANCE.getIBeanInstanceSymbol_Methods();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl <em>IBean Property Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanPropertySymbol()
-         * @generated
-         */
-        EClass IBEAN_PROPERTY_SYMBOL = eINSTANCE.getIBeanPropertySymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Owner</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_PROPERTY_SYMBOL__OWNER = eINSTANCE.getIBeanPropertySymbol_Owner();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl <em>IInstance Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIInstanceSymbol()
-         * @generated
-         */
-        EClass IINSTANCE_SYMBOL = eINSTANCE.getIInstanceSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Type Resolved</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IINSTANCE_SYMBOL__TYPE_RESOLVED = eINSTANCE.getIInstanceSymbol_TypeResolved();
-
-        /**
-         * The meta object literal for the '<em><b>Runtime Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IINSTANCE_SYMBOL__RUNTIME_SOURCE = eINSTANCE.getIInstanceSymbol_RuntimeSource();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl <em>IJava Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaSymbol()
-         * @generated
-         */
-        EClass IJAVA_SYMBOL = eINSTANCE.getIJavaSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Java Element</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_SYMBOL__JAVA_ELEMENT = eINSTANCE.getIJavaSymbol_JavaElement();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getISymbol()
-         * @generated
-         */
-        EClass ISYMBOL = eINSTANCE.getISymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ISYMBOL__NAME = eINSTANCE.getISymbol_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl <em>IType Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getITypeDescriptor()
-         * @generated
-         */
-        EClass ITYPE_DESCRIPTOR = eINSTANCE.getITypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ITYPE_DESCRIPTOR__PROPERTIES = eINSTANCE.getITypeDescriptor_Properties();
-
-        /**
-         * The meta object literal for the '<em><b>Type Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_SIGNATURE = eINSTANCE.getITypeDescriptor_TypeSignature();
-
-        /**
-         * The meta object literal for the '<em><b>Super Type Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = eINSTANCE.getITypeDescriptor_SuperTypeSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Interface Type Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = eINSTANCE.getITypeDescriptor_InterfaceTypeSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Type Signature Delegate</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = eINSTANCE.getITypeDescriptor_TypeSignatureDelegate();
-
-        /**
-         * The meta object literal for the '<em><b>Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ITYPE_DESCRIPTOR__METHODS = eINSTANCE.getITypeDescriptor_Methods();
-
-        /**
-         * The meta object literal for the '<em><b>Type Parameter Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = eINSTANCE.getITypeDescriptor_TypeParameterSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Jdt Context</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__JDT_CONTEXT = eINSTANCE.getITypeDescriptor_JdtContext();
-
-        /**
-         * The meta object literal for the '<em><b>Enum Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__ENUM_TYPE = eINSTANCE.getITypeDescriptor_EnumType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIDescribedInDetail()
-         * @generated
-         */
-        EClass IDESCRIBED_IN_DETAIL = eINSTANCE.getIDescribedInDetail();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl <em>IJava Type Descriptor2</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaTypeDescriptor2()
-         * @generated
-         */
-        EClass IJAVA_TYPE_DESCRIPTOR2 = eINSTANCE.getIJavaTypeDescriptor2();
-
-        /**
-         * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_TYPE_DESCRIPTOR2__TYPE = eINSTANCE.getIJavaTypeDescriptor2_Type();
-
-        /**
-         * The meta object literal for the '<em><b>Bean Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES = eINSTANCE.getIJavaTypeDescriptor2_BeanProperties();
-
-        /**
-         * The meta object literal for the '<em><b>Bean Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS = eINSTANCE.getIJavaTypeDescriptor2_BeanMethods();
-
-        /**
-         * The meta object literal for the '<em><b>Array Count</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT = eINSTANCE.getIJavaTypeDescriptor2_ArrayCount();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl <em>IBean Method Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanMethodSymbol()
-         * @generated
-         */
-        EClass IBEAN_METHOD_SYMBOL = eINSTANCE.getIBeanMethodSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Owner</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_METHOD_SYMBOL__OWNER = eINSTANCE.getIBeanMethodSymbol_Owner();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl <em>IComponent Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIComponentSymbol()
-         * @generated
-         */
-        EClass ICOMPONENT_SYMBOL = eINSTANCE.getIComponentSymbol();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl <em>IProperty Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIPropertySymbol()
-         * @generated
-         */
-        EClass IPROPERTY_SYMBOL = eINSTANCE.getIPropertySymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Intermediate</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IPROPERTY_SYMBOL__INTERMEDIATE = eINSTANCE.getIPropertySymbol_Intermediate();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl <em>IMap Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMapTypeDescriptor()
-         * @generated
-         */
-        EClass IMAP_TYPE_DESCRIPTOR = eINSTANCE.getIMapTypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Map Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMAP_TYPE_DESCRIPTOR__MAP_SOURCE = eINSTANCE.getIMapTypeDescriptor_MapSource();
-
-        /**
-         * The meta object literal for the '<em><b>Immutable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMAP_TYPE_DESCRIPTOR__IMMUTABLE = eINSTANCE.getIMapTypeDescriptor_Immutable();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl <em>IMethod Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMethodSymbol()
-         * @generated
-         */
-        EClass IMETHOD_SYMBOL = eINSTANCE.getIMethodSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMETHOD_SYMBOL__SIGNATURE = eINSTANCE.getIMethodSymbol_Signature();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIObjectSymbol()
-         * @generated
-         */
-        EClass IOBJECT_SYMBOL = eINSTANCE.getIObjectSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Type Descriptor</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IOBJECT_SYMBOL__TYPE_DESCRIPTOR = eINSTANCE.getIObjectSymbol_TypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Readable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IOBJECT_SYMBOL__READABLE = eINSTANCE.getIObjectSymbol_Readable();
-
-        /**
-         * The meta object literal for the '<em><b>Writable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IOBJECT_SYMBOL__WRITABLE = eINSTANCE.getIObjectSymbol_Writable();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl <em>IBounded Map Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedMapTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_MAP_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedMapTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl <em>IBounded Java Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedJavaTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_JAVA_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedJavaTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl <em>IList Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIListTypeDescriptor()
-         * @generated
-         */
-        EClass ILIST_TYPE_DESCRIPTOR = eINSTANCE.getIListTypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>List Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ILIST_TYPE_DESCRIPTOR__LIST_SOURCE = eINSTANCE.getIListTypeDescriptor_ListSource();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl <em>IBounded List Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedListTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_LIST_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedListTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}' enum.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getERuntimeSource()
-         * @generated
-         */
-        EEnum ERUNTIME_SOURCE = eINSTANCE.getERuntimeSource();
-
-        /**
-         * The meta object literal for the '<em>IType</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jdt.core.IType
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIType()
-         * @generated
-         */
-        EDataType ITYPE = eINSTANCE.getIType();
-
-        /**
-         * The meta object literal for the '<em>IJava Element</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jdt.core.IJavaElement
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaElement()
-         * @generated
-         */
-        EDataType IJAVA_ELEMENT = eINSTANCE.getIJavaElement();
-
-        /**
-         * The meta object literal for the '<em>Value Type</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getValueType()
-         * @generated
-         */
-        EDataType VALUE_TYPE = eINSTANCE.getValueType();
-
-    }
-
-} //SymbolPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java
deleted file mode 100644
index 4124126..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java
+++ /dev/null
@@ -1,248 +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.context.symbol.internal.impl;
-
-import java.util.HashMap;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Instance Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl#getMethods <em>Methods</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanInstanceSymbolImpl extends IInstanceSymbolImpl implements IBeanInstanceSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * A detailed description (human readable) about this instance symbol
-	 */
-	protected String			  _detailedDescription = null;
-	
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanInstanceSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the EClass
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL;
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the list of bean properties 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getProperties() 
-	{
-		return getJavaTypeDescriptor().getBeanProperties();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the list of methods 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getMethods() {
-		return getJavaTypeDescriptor().getBeanMethods();
-	}
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public IJavaTypeDescriptor2 getJavaTypeDescriptor() {
-        return (IJavaTypeDescriptor2) getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setJavaTypeDescriptor(IJavaTypeDescriptor2 newTypeDescriptor) {
-        setTypeDescriptor(newTypeDescriptor);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the object related to featureID
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__PROPERTIES:
-                return getProperties();
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__METHODS:
-                return getMethods();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return whether the corresponding feature is set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__PROPERTIES:
-                return !getProperties().isEmpty();
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__METHODS:
-                return !getMethods().isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-	public String getDetailedDescription() 
-	{
-		return _detailedDescription;
-	}
-
-	public void setDetailedDescription(String detailedDescription) 
-	{
-		this._detailedDescription = detailedDescription;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isTypeResolved()
-	 * @generated NOT
-	 */
-	// @Override
-	public boolean isTypeResolved() 
-	{
-		return getJavaTypeDescriptor() != null;
-	}
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#setTypeDescriptor(org.eclipse.jst.jsf.context.symbol.ITypeDescriptor)
-     * @generated NOT
-     */
-    public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) 
-    {
-        if (newTypeDescriptor instanceof IJavaTypeDescriptor2)
-        {
-            super.setTypeDescriptor(newTypeDescriptor);
-        }
-        else
-        {
-            throw new IllegalArgumentException("Bean instance symbol requires a IJavaTypeDescriptor2"); //$NON-NLS-1$
-        }
-    }
-
-    public boolean isReadable() 
-    {
-        // beans always readable
-        return true;
-    }
-
-    public boolean isWritable() 
-    {
-        // beans not writable
-        return false;
-    }
-
-    public void setReadable(boolean value) {
-        // do nothing
-    }
-
-    public void setWritable(boolean value) {
-        // do nothing
-    }
-
-    /* 
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) 
-    {
-        if (supportsCoercion(typeSignature))
-        {
-            if (TypeConstants.TYPE_MAP.equals(typeSignature))
-            {
-                IBoundedMapTypeDescriptor mapDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-                // bean maps are generally writable
-                mapDesc.setImmutable(true);
-                mapDesc.setMapSource(new HashMap());  // give it an empty map
-                return mapDesc;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(typeSignature))
-            {
-                IBoundedListTypeDescriptor listDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedListTypeDescriptor();
-
-                // bean maps are generally writable
-                listDesc.setListSource(new BasicEList());  // give it an empty list
-                return listDesc;
-            }
-        }
-        
-        return null;
-    }
-
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#call(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * 
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments,
-            String symbolName) 
-    {
-        return Util.call(methodName, methodArguments, symbolName, getTypeDescriptor());
-    }
-
-} //IBeanInstanceSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java
deleted file mode 100644
index 76505d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java
+++ /dev/null
@@ -1,376 +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.context.symbol.internal.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.jdt.core.IMethod;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Method Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getSignature <em>Signature</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanMethodSymbolImpl extends EObjectImpl implements IBeanMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle"; //$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 #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String SIGNATURE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected String signature = SIGNATURE_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getOwner() <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getOwner()
-     * @generated
-     * @ordered
-     */
-	protected IJavaTypeDescriptor2 owner = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanMethodSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_METHOD_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the name of the method symbol 
-     * <!-- 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, SymbolPackage.IBEAN_METHOD_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the signature in JVM/JDT form 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getSignature() {
-        return signature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newSignature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSignature(String newSignature) {
-        String oldSignature = signature;
-        signature = newSignature;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE, oldSignature, signature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the java type descriptor that owns this symbol
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 getOwner() {
-        if (owner != null && owner.eIsProxy()) {
-            InternalEObject oldOwner = (InternalEObject)owner;
-            owner = (IJavaTypeDescriptor2)eResolveProxy(oldOwner);
-            if (owner != oldOwner) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER, oldOwner, owner));
-            }
-        }
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the java type descriptor that derives this symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 basicGetOwner() {
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newOwner 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setOwner(IJavaTypeDescriptor2 newOwner) {
-        IJavaTypeDescriptor2 oldOwner = owner;
-        owner = newOwner;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER, oldOwner, owner));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the feature object for featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                return getSignature();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                if (resolve) return getOwner();
-                return basicGetOwner();
-        }
-        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 SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                setSignature((String)newValue);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                setSignature(SIGNATURE_EDEFAULT);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                return SIGNATURE_EDEFAULT == null ? signature != null : !SIGNATURE_EDEFAULT.equals(signature);
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                return owner != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param derivedFeatureID 
-     * @param baseClass 
-     * @return the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-        if (baseClass == ISymbol.class) {
-            switch (derivedFeatureID) {
-                case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME: return SymbolPackage.ISYMBOL__NAME;
-                default: return -1;
-            }
-        }
-        if (baseClass == IMethodSymbol.class) {
-            switch (derivedFeatureID) {
-                case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE: return SymbolPackage.IMETHOD_SYMBOL__SIGNATURE;
-                default: return -1;
-            }
-        }
-        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param baseFeatureID 
-     * @param baseClass 
-     * @return the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-        if (baseClass == ISymbol.class) {
-            switch (baseFeatureID) {
-                case SymbolPackage.ISYMBOL__NAME: return SymbolPackage.IBEAN_METHOD_SYMBOL__NAME;
-                default: return -1;
-            }
-        }
-        if (baseClass == IMethodSymbol.class) {
-            switch (baseFeatureID) {
-                case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE: return SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE;
-                default: return -1;
-            }
-        }
-        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string representation 
-	 * <!-- 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(", signature: "); //$NON-NLS-1$
-        result.append(signature);
-        result.append(')');
-        return result.toString();
-    }
-
-	public String getDetailedDescription() {
-	    StringBuffer descBuffer = new StringBuffer("<p><b>Signature:</b> ");
-        descBuffer.append(Signature.toString(signature, getName(), null, false, true)).append("</p>");
-        IMethod method = JavaUtil.findCorrespondingMethod(this);
-        if (method != null) {
-            String javadoc = JavaUtil.getMethodJavadoc(method);
-            if (javadoc != null) {
-                descBuffer.append("<p>").append(javadoc).append("</p>");
-            }
-        }
-        return descBuffer.toString();
-    }
-    
-	public void setDetailedDescription(String detailedDescription) {
-		throw new UnsupportedOperationException("Detailed Description is derived on property symbols"); //$NON-NLS-1$
-	}
-
-
-} //IBeanMethodSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java
deleted file mode 100644
index e80a123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java
+++ /dev/null
@@ -1,354 +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.context.symbol.internal.impl;
-
-import java.util.HashMap;
-
-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.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Property Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanPropertySymbolImpl extends IPropertySymbolImpl implements IBeanPropertySymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding") //$NON-NLS-1$
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-
-    /**
-     * The cached value of the '{@link #getOwner() <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getOwner()
-     * @generated
-     * @ordered
-     */
-	protected IJavaTypeDescriptor2 owner = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanPropertySymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_PROPERTY_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the owner's type descriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 getOwner() {
-        if (owner != null && owner.eIsProxy()) {
-            InternalEObject oldOwner = (InternalEObject)owner;
-            owner = (IJavaTypeDescriptor2)eResolveProxy(oldOwner);
-            if (owner != oldOwner) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER, oldOwner, owner));
-            }
-        }
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return the java type descriptor for this instance
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 basicGetOwner() {
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newOwner 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setOwner(IJavaTypeDescriptor2 newOwner) {
-        IJavaTypeDescriptor2 oldOwner = owner;
-        owner = newOwner;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER, oldOwner, owner));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the value for the featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                if (resolve) return getOwner();
-                return basicGetOwner();
-        }
-        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 SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature is set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                return owner != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-	public String getDetailedDescription() 
-	{
-		return createDetailedDescription();
-	}
-
-	public void setDetailedDescription(String detailedDescription) 
-	{
-		throw new UnsupportedOperationException("Detailed Description is derived on property symbols"); //$NON-NLS-1$
-	}
-
-    /**
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(final String typeSignature) 
-    {
-        // ensure that we have an erased version
-        final String erasedTypeSignature = Signature.getTypeErasure(typeSignature);
-        
-        if (supportsCoercion(typeSignature))
-        {
-            if (TypeConstants.TYPE_MAP.equals(erasedTypeSignature))
-            {
-                IBoundedMapTypeDescriptor mapDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-                // bean maps are generally writable
-                mapDesc.setImmutable(true);
-                mapDesc.setMapSource(new HashMap());  // give it an empty map
-                return mapDesc;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(erasedTypeSignature))
-            {
-                IBoundedListTypeDescriptor listDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedListTypeDescriptor();
-                listDesc.setJdtContext(deriveBestJdtContext());
-                 
-                // bean maps are generally writable
-                return listDesc;
-            }
-        }
-        
-        return null;
-
-    }
-
-    /**
-     * @return the derived jdt element
-     * @generated NOT
-     */
-    private IJavaElement deriveBestJdtContext()
-    {
-        IJavaElement contextElement = null;
-        if (getTypeDescriptor() instanceof IJavaTypeDescriptor2)
-        {
-            contextElement = 
-                ((IJavaTypeDescriptor2)getTypeDescriptor()).getType();
-        }
-        
-        if (contextElement == null)
-        {
-            contextElement = getTypeDescriptor().getJdtContext();
-        }
-
-        return contextElement;
-    }
-    
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#call(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * 
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments,
-            String symbolName) 
-    {
-        return Util.call(methodName, methodArguments, symbolName, getTypeDescriptor());
-    }
-
-
-//    private List convertArgsToSignatures(List methodArgs)
-//    {
-//        List args = new ArrayList();
-//        
-//        for (final Iterator it = methodArgs.iterator(); it.hasNext();)
-//        {
-//            Object arg = it.next();
-//            String className = arg.getClass().getName();
-//            String resolvedName = Signature.createTypeSignature(className, true);
-//            args.add(resolvedName);
-//        }
-//        
-//        return args;
-//    }
-
-    /**
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // first check that our type descriptor even thinks it is
-        // an instanceof this type
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            // for java bean instances, we need to minimally support
-            // Map, List and Array to conform to the basic spec
-            // for JSF EL
-            if (TypeConstants.TYPE_MAP.equals(Signature.getTypeErasure(typeSignature)))
-            {
-                return true;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(Signature.getTypeErasure(typeSignature)))
-            {
-                return true;
-            }
-        }
-        
-        // otherwise, not supported
-        return false;
-    }
-    
-    /**
-     * @return the detail description
-     * @generated NOT
-     */
-    private String createDetailedDescription()
-    {
-        StringBuffer additionalInfo = new StringBuffer("<p><b>"); //$NON-NLS-1$
-        ITypeDescriptor typeDescriptor_ = getTypeDescriptor();
-        if (typeDescriptor_ != null) {
-            additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.Type")); //$NON-NLS-1$
-            additionalInfo.append("</b>"); //$NON-NLS-1$
-            additionalInfo.append(Signature.toString(typeDescriptor_.getTypeSignature()));
-        }
-        additionalInfo.append("</p>"); //$NON-NLS-1$
-        additionalInfo.append("<p><b>"); //$NON-NLS-1$
-        
-        additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.Access"));  //$NON-NLS-1$
-        additionalInfo.append("</b>"); //$NON-NLS-1$
-        if (isReadable() && isWritable()) {
-            additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.read_write")); //$NON-NLS-1$
-        } else if (isReadable()) { 
-            additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.readonly")); //$NON-NLS-1$
-        } else if (isWritable()) { 
-            additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.writeonly")); //$NON-NLS-1$
-        } else {
-            additionalInfo.append(Messages.getString("IBeanPropertySymbolImpl.none")); //$NON-NLS-1$
-        }
-        additionalInfo.append("</p>"); //$NON-NLS-1$
-        JDTBeanProperty property = JavaUtil.findCorrespondingJDTProperty(this);
-        if (property != null) {
-            String javaDoc = null;
-            if (property.getGetter() != null) {
-                javaDoc = JavaUtil.getMethodJavadoc(property.getGetter());
-            }
-            if (javaDoc == null && property.getSetter() != null) {
-                javaDoc = JavaUtil.getMethodJavadoc(property.getSetter());
-            }
-            if (javaDoc != null) {
-                additionalInfo.append("<p>").append(javaDoc).append("</p>"); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-
-        return additionalInfo.toString();
-    }
-    
-} //IBeanPropertySymbolImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java
deleted file mode 100644
index af1f404..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedJavaTypeDescriptorImpl.java,v 1.8 2007/10/01 04:29:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded Java Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedJavaTypeDescriptorImpl extends IJavaTypeDescriptor2Impl implements IBoundedJavaTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedJavaTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_JAVA_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) {
-        // TODO: for now, return true if the type is a resolved object
-        // need to add support for template checking (Java5) and
-        // decide what to do with unresolved (Q) type signatures
-        return typeSignature != null
-                && typeSignature.startsWith(Character.toString(Signature.C_RESOLVED));
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol retValue = null;
-        
-        if (isUnboundedForType(typeSignature))
-        {
-            IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-            // TODO: there is a possible problem here for non-string keyed maps
-            propSymbol.setName(name.toString());
-            propSymbol.setReadable(true);
-            IBoundedJavaTypeDescriptor typeDesc = 
-                SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-
-            typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-            propSymbol.setTypeDescriptor(typeDesc);
-            retValue = propSymbol;
-        }
-
-        return retValue;
-	}
-
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs,
-            String symbolName) 
-    {
-        return getUnboundedProperty(symbolName, TypeConstants.TYPE_JAVAOBJECT);
-    }
-} //IBoundedJavaTypeDescriptorImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
deleted file mode 100644
index e6cb34b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedListTypeDescriptorImpl.java,v 1.6 2007/10/01 04:29:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded List Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedListTypeDescriptorImpl extends IListTypeDescriptorImpl implements IBoundedListTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedListTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_LIST_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) 
-    {
-        // type signature must be a boxed integer
-        // TODO: at this level, do we need to deal with coercion to
-        // other integer types?  list.get() takes an integer...
-        return typeSignature != null && TypeConstants.TYPE_BOXED_INTEGER.equals(typeSignature);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol  retValue = null;
-
-        if (isUnboundedForType(typeSignature)
-                && name instanceof Number)
-        {
-            // get integer value
-            int offset = ((Number)name).intValue();
-
-            // first see if we have it in our map source
-            // TODO: retValue = getFromMap(name.toString());
-
-            if (retValue == null)
-            {
-                IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                // TODO: there is a possible problem here for non-string keyed maps
-                propSymbol.setName(name.toString());
-                propSymbol.setReadable(true);
-                propSymbol.setTypeDescriptor(getBoundsTypeDescriptor(offset));
-                retValue = propSymbol;
-            }
-        }
-
-        return retValue;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param methodName 
-     * @param methodArguments 
-     * @param symbolName 
-     * @return a symbol representing the return value of the method 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName)
-    {
-        ISymbol result = null;
-        final IType type = resolveType(getTypeSignature());
-        
-        if (type != null)
-        {
-            final JDTBeanIntrospector introspector = 
-                new JDTBeanIntrospector(type);
-            
-            final IMethod callMethod = 
-                matchMethod(methodName, methodArguments, introspector.getAllMethods());
-            
-            if (callMethod != null)
-            {
-                try 
-                {
-                    // resolve the method's return type; don't erase parameters
-                    final String retTypeSignature = 
-                        TypeUtil.resolveTypeSignature
-                            (type, callMethod.getReturnType(), false) ;
-                    
-                    final IPropertySymbol  propSymbol = 
-                        SymbolFactory.eINSTANCE.createIPropertySymbol();
-
-                    // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName);
-                    propSymbol.setReadable(true);
-                    IJavaTypeDescriptor2 typeDesc = 
-                        SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                    
-                    typeDesc.setArrayCount(Signature.getArrayCount(retTypeSignature));
-                    
-                    // may be null
-                    typeDesc.setType(resolveType(retTypeSignature));
-                    typeDesc.setTypeSignatureDelegate(retTypeSignature);
-                    propSymbol.setTypeDescriptor(typeDesc);
-                    result = propSymbol;
-                } 
-                catch (JavaModelException e) 
-                {
-                    JSFCommonPlugin.log(e);
-                    // fall-through and return null result
-                }
-            }
-        }
-        
-        return result;
-    }
-    
-    private IMethod matchMethod(String name, List methodArguments, IMethod[] allMethods)
-    {
-        final List argSigs = convertArgsToSignatures(methodArguments);
-        IMethod matchedMethod = null;
-        
-        for (int i = 0; i < allMethods.length; i++)
-        {
-            final IMethod method = allMethods[i];
-            
-            // check for names and argument count match
-            if (method.getParameterTypes().length == argSigs.size()
-                    && method.getElementName().equals(name))
-            {
-                String[] methods = method.getParameterTypes();
-                // need to verify argument matches
-                boolean isMatched = true;
-                CHECK_ARGUMENTS: for (int j = 0; j < methods.length; j++)
-                {
-                    if (!methods[j].equals(argSigs.get(j)))
-                    {
-                        // not a match
-                        isMatched = false;
-                        break CHECK_ARGUMENTS;
-                    }
-                }
-                
-                if (isMatched)
-                {
-                    return method;
-                }
-            }
-        }
-
-        return matchedMethod;
-    }
-
-    private List convertArgsToSignatures(List methodArgs)
-    {
-        List args = new ArrayList();
-        
-        for (final Iterator it = methodArgs.iterator(); it.hasNext();)
-        {
-            Object arg = it.next();
-            String className = arg.getClass().getName();
-            String resolvedName = Signature.createTypeSignature(className, true);
-            args.add(resolvedName);
-        }
-        
-        return args;
-    }
-    
-    /**
-     * @return the ITypeDescriptor for this List's element type (bound type).
-     * Defaults to java.lang.Object if no bounds or can't resolve bounds
-     * 
-     * @generated NOT 
-     */
-    private ITypeDescriptor getBoundsTypeDescriptor(int offset)
-    {
-        IJavaTypeDescriptor2  typeDesc = null;
-        
-        List typeParameters = getTypeParameterSignatures();
-        
-        // if no bounds at all, then default to bounded java object
-        if (typeParameters.size() == 0)
-        {
-            typeDesc = 
-                SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-            
-            typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-        }
-        else
-        {
-            // TODO: there should only be exactly one on a list...
-            final String elementType = (String) typeParameters.get(0);
-            
-            typeDesc = 
-                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-            
-            typeDesc.setArrayCount(Signature.getArrayCount(elementType));
-            
-            // may be null
-            typeDesc.setType(resolveType(elementType));
-            typeDesc.setTypeSignatureDelegate(elementType);
-        }
-
-        return typeDesc;
-    }
-} //IBoundedListTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java
deleted file mode 100644
index 1989995..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedMapTypeDescriptorImpl.java,v 1.7 2007/10/01 04:29:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-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.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded Map Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedMapTypeDescriptorImpl extends IMapTypeDescriptorImpl implements IBoundedMapTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedMapTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_MAP_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) {
-        // TODO: for now, return true if the type is a resolved object
-        // need to add support for template checking (Java5) and
-        // decide what to do with unresolved (Q) type signatures
-        return typeSignature != null
-                && typeSignature.startsWith(Character.toString(Signature.C_RESOLVED));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol  retValue = null;
-        
-        if (isUnboundedForType(typeSignature))
-        {
-            // first see if we have it in our map source
-            retValue = getFromMap(name.toString());
-            
-            if (retValue == null)
-            {
-                IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                // TODO: there is a possible problem here for non-string keyed maps
-                propSymbol.setName(name.toString());
-                propSymbol.setReadable(true);
-                IBoundedJavaTypeDescriptor typeDesc = 
-                    SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-                
-                typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-                propSymbol.setTypeDescriptor(typeDesc);
-                retValue = propSymbol;
-            }
-        }
-
-        return retValue;
-
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#calculateSyntheticCall(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * @generated NOT
-     */
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs,
-            String symbolName) {
-        if ("get".equals(methodName)  //$NON-NLS-1$
-                && methodArgs.size() == 1)
-        {
-            return getUnboundedProperty(symbolName, ((ValueType) methodArgs.get(0)).getSignature());
-        }
-            
-        // default is return null
-        return null;
-    }
-
-
-    /**
-     * @generated NOT
-     */
-    private ISymbol getFromMap(final String name)
-    {
-        for (final Iterator it = getProperties().iterator(); it.hasNext();)
-        {
-            ISymbol  symbol = (ISymbol) it.next();
-            
-            if (symbol.getName().equals(name))
-            {
-                return symbol;
-            }
-        }
-        
-        return null;
-    }
-
-} //IBoundedMapTypeDescriptorImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java
deleted file mode 100644
index 15a592e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java
+++ /dev/null
@@ -1,99 +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.context.symbol.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IComponent Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IComponentSymbolImpl extends IInstanceSymbolImpl implements IComponentSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * A human readable description of this symbol
-     */
-    protected String  _detailedDescription = null;
-    
-    /**
-     * true if this component symbol is readable
-     */
-    protected boolean _isReadable = READABLE_EDEFAULT;
-    
-    /**
-     * true if this component symbol is writable
-     */
-    protected boolean _isWritable = WRITABLE_EDEFAULT;
-    
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IComponentSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ICOMPONENT_SYMBOL;
-    }
-
-    public String getDetailedDescription() {
-        return _detailedDescription;
-    }
-
-    public void setDetailedDescription(String detailedDescription) {
-        _detailedDescription = detailedDescription;
-    }
-
-    /**
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) {
-        // TODO:
-        return getTypeDescriptor();
-    }
-
-    /** 
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // TODO:
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            return true;
-        }
-        return false;
-    }
-} //IComponentSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java
deleted file mode 100644
index bc868c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java
+++ /dev/null
@@ -1,499 +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.context.symbol.internal.impl;
-
-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.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-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.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IInstance Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isWritable <em>Writable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isTypeResolved <em>Type Resolved</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getRuntimeSource <em>Runtime Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IInstanceSymbolImpl extends EObjectImpl implements IInstanceSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$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 cached value of the '{@link #getTypeDescriptor() <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTypeDescriptor()
-     * @generated
-     * @ordered
-     */
-	protected ITypeDescriptor typeDescriptor = null;
-
-    /**
-     * The default value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated NOT
-     * @ordered
-     */
-    protected static final boolean READABLE_EDEFAULT = true;
-
-    /**
-     * The cached value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected boolean readable = READABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean WRITABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected boolean writable = WRITABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isTypeResolved() <em>Type Resolved</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #isTypeResolved()
-     * @generated
-     * @ordered
-     */
-	protected static final boolean TYPE_RESOLVED_EDEFAULT = false;
-
-    /**
-     * The default value of the '{@link #getRuntimeSource() <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRuntimeSource()
-     * @generated
-     * @ordered
-     */
-    protected static final ERuntimeSource RUNTIME_SOURCE_EDEFAULT = ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL;
-
-    /**
-     * The cached value of the '{@link #getRuntimeSource() <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRuntimeSource()
-     * @generated
-     * @ordered
-     */
-    protected ERuntimeSource runtimeSource = RUNTIME_SOURCE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IInstanceSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IINSTANCE_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol 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, SymbolPackage.IINSTANCE_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type descriptor for this instance 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ITypeDescriptor getTypeDescriptor() {
-        if (typeDescriptor != null && typeDescriptor.eIsProxy()) {
-            InternalEObject oldTypeDescriptor = (InternalEObject)typeDescriptor;
-            typeDescriptor = (ITypeDescriptor)eResolveProxy(oldTypeDescriptor);
-            if (typeDescriptor != oldTypeDescriptor) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-            }
-        }
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return the instance type
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ITypeDescriptor basicGetTypeDescriptor() {
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeDescriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) {
-        ITypeDescriptor oldTypeDescriptor = typeDescriptor;
-        typeDescriptor = newTypeDescriptor;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if instance symbol is readable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isReadable() {
-        return readable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newReadable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setReadable(boolean newReadable) {
-        boolean oldReadable = readable;
-        readable = newReadable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__READABLE, oldReadable, readable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if instance is writable.  
-     * 
-     * Normally, instances should not be 
-     * considered writable, since the VariableResolver has no setter, however
-     * this is included to allow for unforeseen cases that may require an 
-     * instance symbol to appear to be writable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isWritable() {
-        return writable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newWritable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setWritable(boolean newWritable) {
-        boolean oldWritable = writable;
-        writable = newWritable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__WRITABLE, oldWritable, writable));
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return true if the type descriptor has been resolved for this symbol 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isTypeResolved() 
-	{
-		return getTypeDescriptor() != null;
-	}
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return return the symbol's runtime source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ERuntimeSource getRuntimeSource() {
-        return runtimeSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newRuntimeSource 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRuntimeSource(ERuntimeSource newRuntimeSource) {
-        ERuntimeSource oldRuntimeSource = runtimeSource;
-        runtimeSource = newRuntimeSource == null ? RUNTIME_SOURCE_EDEFAULT : newRuntimeSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE, oldRuntimeSource, runtimeSource));
-    }
-
-    /**
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) 
-    {
-        // first check that our type descriptor even thinks it is
-        // an instanceof this type
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            // for java bean instances, we need to minimally support
-            // Map, List and Array to conform to the basic spec
-            // for JSF EL
-            if (TypeConstants.TYPE_MAP.equals(typeSignature))
-            {
-                return true;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(typeSignature)
-                       /*TODO: || isArray*/)
-            {
-                return true;
-            }
-        }
-        
-        // otherwise, not supported
-        return false;
-    }
-
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) {
-        // TODO:
-        return getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName) {
-        return Util.call(methodName,methodArguments,symbolName,getTypeDescriptor());
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the value for the featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                if (resolve) return getTypeDescriptor();
-                return basicGetTypeDescriptor();
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                return isReadable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                return isWritable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-                return isTypeResolved() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                return getRuntimeSource();
-        }
-        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 SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)newValue);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                setReadable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                setWritable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                setRuntimeSource((ERuntimeSource)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)null);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                setReadable(READABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                setWritable(WRITABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                setRuntimeSource(RUNTIME_SOURCE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                return typeDescriptor != null;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                return readable != READABLE_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                return writable != WRITABLE_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-                return isTypeResolved() != TYPE_RESOLVED_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                return runtimeSource != RUNTIME_SOURCE_EDEFAULT;
-        }
-        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(" (name: ");  //$NON-NLS-1$
-        result.append(name);
-        result.append(", readable: "); //$NON-NLS-1$
-        result.append(readable);
-        result.append(", writable: "); //$NON-NLS-1$
-        result.append(writable);
-        result.append(", runtimeSource: "); //$NON-NLS-1$
-        result.append(runtimeSource);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IInstanceSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java
deleted file mode 100644
index 32d8de6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java
+++ /dev/null
@@ -1,241 +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.context.symbol.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.jdt.core.IJavaElement;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IJava Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl#getJavaElement <em>Java Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IJavaSymbolImpl extends EObjectImpl implements IJavaSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle";  //$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 #getJavaElement() <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getJavaElement()
-     * @generated
-     * @ordered
-     */
-	protected static final IJavaElement JAVA_ELEMENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJavaElement() <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getJavaElement()
-     * @generated
-     * @ordered
-     */
-	protected IJavaElement javaElement = JAVA_ELEMENT_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IJavaSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IJAVA_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol 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, SymbolPackage.IJAVA_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the IJavaElement associated with this symbol
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaElement getJavaElement() {
-        return javaElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newJavaElement 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setJavaElement(IJavaElement newJavaElement) {
-        IJavaElement oldJavaElement = javaElement;
-        javaElement = newJavaElement;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT, oldJavaElement, javaElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the feature 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                return getJavaElement();
-        }
-        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 SymbolPackage.IJAVA_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                setJavaElement((IJavaElement)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                setJavaElement(JAVA_ELEMENT_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if featureID's feature has been set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                return JAVA_ELEMENT_EDEFAULT == null ? javaElement != null : !JAVA_ELEMENT_EDEFAULT.equals(javaElement);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string representation 
-	 * <!-- 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(", javaElement: "); //$NON-NLS-1$
-        result.append(javaElement);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IJavaSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
deleted file mode 100644
index dde647c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
+++ /dev/null
@@ -1,676 +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.context.symbol.internal.impl;
-
-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 org.eclipse.emf.common.notify.Notification;
-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.impl.ENotificationImpl;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeInfoCache;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IJava Type Descriptor2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getBeanProperties <em>Bean Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getBeanMethods <em>Bean Methods</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getArrayCount <em>Array Count</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IJavaTypeDescriptor2Impl extends ITypeDescriptorImpl implements IJavaTypeDescriptor2 {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getType()
-     * @generated
-     * @ordered
-     */
-	protected static final IType TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getType()
-     * @generated
-     * @ordered
-     */
-	protected IType type = TYPE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getArrayCount() <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getArrayCount()
-     * @generated
-     * @ordered
-     */
-    protected static final int ARRAY_COUNT_EDEFAULT = 0;
-
-    /**
-     * The cached value of the '{@link #getArrayCount() <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * records the array nesting of the type.  IType doesn't encapsulate
-     * array types. So if this type is an array then type will represent
-     * the base element and this value will be > 0.  If not an array, then
-     * _arrayCount is always 0. 
-     * <!-- end-user-doc -->
-     * @see #getArrayCount()
-     * @generated
-     * @ordered
-     */
-    protected int arrayCount = ARRAY_COUNT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    @SuppressWarnings("hiding")
-	protected static final IJavaElement JDT_CONTEXT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    @SuppressWarnings("hiding")
-	protected IJavaElement jdtContext = JDT_CONTEXT_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IJavaTypeDescriptor2Impl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the JDT type descriptor; if type is an array then this type
-     * represent's the array base type only
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IType getType() {
-        return type;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newType 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setType(IType newType) {
-        IType oldType = type;
-        type = newType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE, oldType, type));
-    }
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getInterfaceTypeSignatures()
-	 * @generated NOT
-	 */
-	public EList getInterfaceTypeSignatures() 
-    {
-        EList  interfaces = new BasicEList();
-        
-        IType type_ = getType();
-        
-        if (type_ != null)
-        {
-            final TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-            IType[] interfaceTypes = typeInfoCache.getCachedInterfaceTypes(type_);
-            if (interfaceTypes == null) {
-               interfaceTypes = typeInfoCache.cacheInterfaceTypesFor(type_);
-            }
-            copySignatures(interfaces, interfaceTypes);
-        }
-        
-        return interfaces;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getSuperTypeSignatures()
-     * @generated NOT
-     */
-    public EList getSuperTypeSignatures() 
-    {
-        EList  interfaces = new BasicEList();
-        
-        IType type_ = getType();
-        
-        if (type_ != null)
-        {
-            final TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-            IType[] interfaceTypes = typeInfoCache.getCachedSupertypes(type_);
-
-            if (interfaceTypes == null) 
-            {
-               interfaceTypes = typeInfoCache.cacheSupertypesFor(type_);
-            }
-            copySignatures(interfaces, interfaceTypes);
-        }
-        
-        return interfaces;
-    }
-    
-    
-    private void copySignatures(List  list, IType[]  types)
-    {
-        for (int i = 0; i < types.length; i++)
-        {
-            final IType type_ = types[i];
-            final String signature = TypeUtil.getSignature(type_);
-            
-            if (signature != null)
-            {
-                list.add(signature);
-            }
-        }
-    }
-
-    public EList getProperties() 
-    {
-        return getBeanProperties();
-    }
-
-    
-    public EList getMethods() 
-    {
-        return getBeanMethods();
-    }
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the bean props for this java type 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getBeanProperties() 
-	{
-	    TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-	    IBeanPropertySymbol[] properties = typeInfoCache.getCachedPropertySymbols(type);
-	    Collection propertyColl;
-	    if (properties == null) {
-	        propertyColl = getPropertiesInternal();
-	        properties = (IBeanPropertySymbol[]) propertyColl.toArray(new IBeanPropertySymbol[propertyColl.size()]);
-	        typeInfoCache.cachePropertySymbols(type, properties);
-	    } 
-	    else 
-	    {
-            propertyColl = new ArrayList(properties.length);
-            Collections.addAll(propertyColl, (Object[])properties);
-	    }
-	    BasicEList list = new BasicEList(propertyColl);
-	    return list;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the bean methods for this type  
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getBeanMethods() {
-	    TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-	    IBeanMethodSymbol[] methods = typeInfoCache.getCachedMethodSymbols(type);
-	    Collection methodColl;
-	    if (methods == null) 
-	    {
-	        methodColl = getMethodsInternal();
-	        methods = (IBeanMethodSymbol[]) methodColl.toArray(new IBeanMethodSymbol[methodColl.size()]);
-	        typeInfoCache.cacheMethodSymbols(type, methods);
-	    } else {
-	        methodColl = new ArrayList(methods.length);
-	        Collections.addAll(methodColl, (Object[])methods);
-	    }
-	    BasicEList list = new BasicEList(methodColl);
-		return list;
-	}
-
-    
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int getArrayCount() {
-        return arrayCount;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setArrayCount(int newArrayCount) {
-        int oldArrayCount = arrayCount;
-        arrayCount = newArrayCount;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT, oldArrayCount, arrayCount));
-    }
-
-	/**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IJavaElement getJdtContext() {
-        return jdtContext;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setJdtContext(IJavaElement newJdtContext) {
-        IJavaElement oldJdtContext = jdtContext;
-        jdtContext = newJdtContext;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT, oldJdtContext, jdtContext));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * Tries to load an IType for a fully resolved (i.e. starts with L not Q)
-     * type signature using the current jdtContext.
-     * 
-     * @return the resolved IType or null if none could be resolved.
-     * 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public IType resolveType(String resolvedTypeSignature) 
-    {
-        IType resolvedType = null;
-        
-        // we need to obtain an IJavaProject within which to resolve
-        // the type.
-        IJavaProject project = null;
-        
-        // first, see if we have an IType
-        if (getType() != null)
-        {
-            // optimize: if the type sig is my type sig, then return getType()
-            if (resolvedTypeSignature.equals(getTypeSignature()))
-            {
-                resolvedType = getType();
-            }
-            else
-            {
-                project = getType().getJavaProject();
-                
-                if (project != null)
-                {
-                    resolvedType =  TypeUtil.resolveType(project, resolvedTypeSignature);
-                }
-            }
-        }        
-        
-        // if not, see if a jdtContext hint has been set
-        if (resolvedType == null && getJdtContext() != null)
-        {
-            resolvedType = super.resolveType(resolvedTypeSignature);
-        }
-        
-        return resolvedType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                return getType();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                return getBeanProperties();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                return getBeanMethods();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                return Integer.valueOf(getArrayCount());
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                setType((IType)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                getBeanProperties().clear();
-                getBeanProperties().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                getBeanMethods().clear();
-                getBeanMethods().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                setArrayCount(((Integer)newValue).intValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                setType(TYPE_EDEFAULT);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                getBeanProperties().clear();
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                getBeanMethods().clear();
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                setArrayCount(ARRAY_COUNT_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                return !getBeanProperties().isEmpty();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                return !getBeanMethods().isEmpty();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                return arrayCount != ARRAY_COUNT_EDEFAULT;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    public boolean isArray() 
-    {
-	    return getArrayCount() > 0;
-    }
-
-    /**
-	 * @generated NOT
-	 */
-	public IObjectSymbol getArrayElement() 
-	{
-		if (isArray())
-		{
-			final String typeSignature = getTypeSignature();
-			final int arrayCount_ = Signature.getArrayCount(typeSignature);
-			final String baseType = Signature.getElementType(typeSignature);
-			final String elementTypeSignature = Signature.createArraySignature(baseType, arrayCount_-1);
-
-			final IJavaTypeDescriptor2 elementTypeDesc = 
-				SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-			final String fullyQualifiedElementType = TypeUtil.getFullyQualifiedName(baseType);
-			
-			IType elementType = null;
-
-			try 
-			{
-			    IType myType = getType();
-				if (myType != null)
-				{
-					elementType = getType().getJavaProject()
-					                 .findType(fullyQualifiedElementType);
-				}
-			} 
-			catch (JavaModelException e) 
-			{
-				// suppress
-			}
-
-			if (elementType != null)
-			{
-				elementTypeDesc.setType(elementType);
-			}
-			else
-			{
-				elementTypeDesc.setTypeSignatureDelegate(elementTypeSignature);
-			}
-            
-            elementTypeDesc.setArrayCount(Signature.getArrayCount(elementTypeSignature));
-			
-			IPropertySymbol newPropertySymbol = 
-				SymbolFactory.eINSTANCE.createIPropertySymbol();
-			newPropertySymbol.setTypeDescriptor(elementTypeDesc);
-			newPropertySymbol.setWritable(true);
-			newPropertySymbol.setReadable(true);
-			newPropertySymbol.setName(fullyQualifiedElementType);
-            return newPropertySymbol;
-		}
-
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature()
-     * @generated NOT
-	 */
-	public String getTypeSignature() 
-    {
-        if (getType() == null)
-        {
-            if (eIsSet(SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE))
-            {
-                return getTypeSignatureDelegate();
-            }
-
-            return null;
-        }
-       
-        // make sure to array type nesting if using IType
-        return Signature.createArraySignature(
-                 TypeUtil.getSignature(getType()), getArrayCount());
-    }
-
-    private Collection getPropertiesInternal()
-	{
-        // if I'm an array then I have no bean properties
-        if (isArray())
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        final JDTBeanIntrospector  introspector = 
-            new JDTBeanIntrospector(getType());
-        
-		final Map<String, JDTBeanProperty> properties = introspector.getProperties();
-		
-		final Collection calculatedProps = new ArrayList(properties.size());
-        
-		for (final Iterator<Map.Entry<String, JDTBeanProperty>> it = properties.entrySet().iterator(); it.hasNext();)
-		{
-		    Map.Entry<String, JDTBeanProperty> entry = it.next();
-		    final String propertyName = entry.getKey();
-            final JDTBeanProperty property = entry.getValue();
-
-			final IBeanPropertySymbol workingCopy =
-			    SymbolFactory.eINSTANCE.createIBeanPropertySymbol();
-			workingCopy.setName(propertyName);
-			workingCopy.setOwner(this);
-                        
-            final IJavaTypeDescriptor2 workingCopyDesc = 
-                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-            workingCopy.setTypeDescriptor(workingCopyDesc);
-			workingCopy.setReadable(property.isReadable());
-            workingCopy.setWritable(property.isWritable());
-                            
-            workingCopyDesc.setArrayCount(property.getArrayCount());
-            workingCopyDesc.getTypeParameterSignatures().addAll(property.getTypeParameterSignatures());
-            workingCopyDesc.setEnumType(property.isEnumType());
-           
-            final IType newType = property.getType();
-            final String signature = property.getTypeSignature();
-            
-            if (newType != null)
-            {
-                workingCopyDesc.setType(newType);
-            }
-            else
-            {
-                workingCopyDesc.setTypeSignatureDelegate(signature);
-            }
-            
-            calculatedProps.add(workingCopy);
-		}
-
-		return calculatedProps;
-	}
-
-    private Collection getMethodsInternal()
-	{
-        JDTBeanIntrospector introspector =
-            new JDTBeanIntrospector(getType());
-        
-		IMethod[] methods = introspector.getAllMethods();
-
-        List methodSymbols = new ArrayList();
-
-		for (int i = 0; i < methods.length; i++)
-		{
-			IMethod method = methods[i];
-			
-			try
-			{
-				// to be a bean method, it must not a constructor, must be public
-				// and must not be static
-				if (!method.isConstructor()
-						&& Flags.isPublic(method.getFlags())
-						&& !Flags.isStatic(method.getFlags()))
-				{
-					String methodName = method.getElementName();
-					IBeanMethodSymbol workingCopy = SymbolFactory.eINSTANCE.createIBeanMethodSymbol();
-					workingCopy.setName(methodName);
-					workingCopy.setOwner(this);
-                    workingCopy.setSignature(TypeUtil.
-                                                resolveMethodSignature
-                                                    (getType(), 
-                                                     method.getSignature()));
-					methodSymbols.add(workingCopy);
-				}
-			}
-			catch (JavaModelException jme)
-			{
-				// error reading meta-data.  Skip to next one
-                JSFCommonPlugin.log(jme);
-			}
-		}
-		
-		return methodSymbols;
-	}
-
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string rep 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (type: "); //$NON-NLS-1$
-        result.append(type);
-        result.append(", arrayCount: "); //$NON-NLS-1$
-        result.append(arrayCount);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IJavaTypeDescriptor2Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java
deleted file mode 100644
index 7046cee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IListTypeDescriptorImpl.java,v 1.5 2007/10/01 04:29:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ECollections;
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IList Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl#getListSource <em>List Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IListTypeDescriptorImpl extends ITypeDescriptorImpl implements IListTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getListSource() <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getListSource()
-     * @generated
-     * @ordered
-     */
-    protected static final EList LIST_SOURCE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getListSource() <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getListSource()
-     * @generated
-     * @ordered
-     */
-    protected EList listSource = LIST_SOURCE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IListTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ILIST_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getListSource() {
-        return listSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setListSource(EList newListSource) {
-        EList oldListSource = listSource;
-        listSource = newListSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE, oldListSource, listSource));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                return getListSource();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                setListSource((EList)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                setListSource(LIST_SOURCE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                return LIST_SOURCE_EDEFAULT == null ? listSource != null : !LIST_SOURCE_EDEFAULT.equals(listSource);
-        }
-        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(" (listSource: ");  //$NON-NLS-1$
-        result.append(listSource);
-        result.append(')');
-        return result.toString();
-    }
-
-    /* 
-     * @generated NOT
-     */
-    public EList getInterfaceTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    public EList getMethods() 
-    {
-        // TODO: should this return the methods on  a List?
-        return ECollections.EMPTY_ELIST;   
-    }
-
-    public EList getProperties() 
-    {
-        // TODO: a list has no properties as such.  What to do here?
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /** 
-     * @generated NOT
-     */
-    public EList getSuperTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /**
-     * @generated NOT
-     */
-    public String getTypeSignature() 
-    {
-        return TypeConstants.TYPE_LIST;
-    }
-
-} //IListTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapSourceInfo.java
deleted file mode 100644
index a5de579..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapSourceInfo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-/**
- * Information about the map source used by the IMapTypeDescriptor
- *
- */
-public interface IMapSourceInfo
-{
-    
-    /**
-     * @param key
-     * @return true if the map source has changed since key was last set
-     */
-    boolean hasChanged(final Object key);
-    
-    /**
-     * The key is used in the standard HashMap way.
-     * 
-     * @param key
-     * @return the cached value for the key.
-     */
-    Object getCachedValue(final Object key);
-    /**
-     * Add cached value for key.
-     * 
-     * @param key
-     * @param value
-     */
-    void putCachedValue(final Object key, final Object value);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java
deleted file mode 100644
index 161102b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java
+++ /dev/null
@@ -1,464 +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.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.ECollections;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-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.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.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IMap Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl#getMapSource <em>Map Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl#isImmutable <em>Immutable</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IMapTypeDescriptorImpl extends ITypeDescriptorImpl implements IMapTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getMapSource() <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMapSource()
-     * @generated
-     * @ordered
-     */
-    protected static final Map MAP_SOURCE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getMapSource() <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMapSource()
-     * @generated
-     * @ordered
-     */
-    protected Map mapSource = MAP_SOURCE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isImmutable() <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isImmutable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean IMMUTABLE_EDEFAULT = true;
-
-    private static final Object MAP_TYPE_DESCRIPTOR_PROP_KEY = new Object();
-
-    /**
-     * The cached value of the '{@link #isImmutable() <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isImmutable()
-     * @generated
-     * @ordered
-     */
-    protected boolean immutable = IMMUTABLE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IMapTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eClass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the map source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Map getMapSource() {
-        return mapSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newMapSource 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setMapSource(Map newMapSource) {
-        Map oldMapSource = mapSource;
-        mapSource = newMapSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE, oldMapSource, mapSource));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if this map is immutable as defined in the java.util.Map
-     * interface. 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isImmutable() {
-        return immutable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newImmutable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setImmutable(boolean newImmutable) {
-        boolean oldImmutable = immutable;
-        immutable = newImmutable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE, oldImmutable, immutable));
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature()
-     * @generated NOT
-     */
-    public String getTypeSignature() 
-    {
-        // if the delegate has been set, use it
-        if (eIsSet(SymbolPackage.IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE))
-        {
-            return getTypeSignatureDelegate();
-        }
-        
-        // otherwise use Map
-        return TypeConstants.TYPE_MAP;
-    }
-
-    public EList getInterfaceTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    public EList getSuperTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getProperties()
-     */
-    public EList getProperties()
-    {
-        final BasicEList list = new BasicEList();
-        final Map source = getMapSource();
-        if (source instanceof IMapSourceInfo)
-        {
-            if (!((IMapSourceInfo) source).hasChanged(MAP_TYPE_DESCRIPTOR_PROP_KEY))
-            {
-                EList cachedList = (EList) ((IMapSourceInfo)source).getCachedValue(MAP_TYPE_DESCRIPTOR_PROP_KEY);
-
-                if (cachedList != null)
-                {
-                    return cachedList;
-                }
-            }
-        }
-        final Map segmentMap = processSegments(source);
-        list.addAll(segmentMap.values());
-
-        if (source instanceof IMapSourceInfo)
-        {
-            ((IMapSourceInfo)source).putCachedValue(MAP_TYPE_DESCRIPTOR_PROP_KEY, list);
-        }
-        return list;
-    }
-
-    public EList getMethods() 
-    {
-        // TODO: should this return the methods on  a Map?
-        return ECollections.EMPTY_ELIST;
-    }
-    
-    /**
-     * @generated NOT
-     */
-    public IObjectSymbol getArrayElement()
-    {
-        return null;
-    }
-
-    /**
-     * @generated NOT
-     */
-    public boolean isArray()
-    {
-        // a map is never an array
-        return false;
-    }
-
-    private Map processSegments(final Map source)
-    {
-        final Map segmentMap = new HashMap();
-        final Set<Map.Entry<String, Object>> entrySet = source.entrySet();
-        for (final Map.Entry<String, Object> entry : entrySet)
-        {
-
-            final String key = entry.getKey();
-            final String segments[] = fastTokenSplit(key);
-            if (segments.length == 0)
-            {
-                continue;
-            }
-            IPropertySymbol property = (IPropertySymbol) segmentMap
-                    .get(segments[0]);
-
-            if (property == null)
-            {
-                final Object propValue = entry.getValue();
-                property = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                property.setName(segments[0]);
-                ITypeDescriptor typeDesc = null;
-
-                // TODO: need wrapper object to rationalize
-                if (propValue != null)
-                {
-                    if (propValue instanceof IType)
-                    {
-                        typeDesc = SymbolFactory.eINSTANCE
-                                .createIJavaTypeDescriptor2();
-                        ((IJavaTypeDescriptor2) typeDesc)
-                                .setType((IType) propValue);
-                    } else if (propValue instanceof IInstanceSymbol)
-                    {
-                        typeDesc = ((IInstanceSymbol) propValue)
-                                .getTypeDescriptor();
-                    } else if (propValue instanceof IPropertySymbol)
-                    {
-                        typeDesc = ((IPropertySymbol) propValue)
-                                .getTypeDescriptor();
-                    } else
-                    {
-                        final String className = propValue.getClass().getName();
-                        final String typeSignature = Signature
-                                .createTypeSignature(className, true);
-                        typeDesc = SymbolFactory.eINSTANCE
-                                .createIMapTypeDescriptor();
-                        ((IMapTypeDescriptor) typeDesc)
-                                .setMapSource(new HashMap());
-                        ((IMapTypeDescriptor) typeDesc)
-                                .setTypeSignatureDelegate(typeSignature);
-                        // inherit this descriptor's mutability
-                        ((IMapTypeDescriptor) typeDesc)
-                                .setImmutable(isImmutable());
-                        property.setIntermediate(true); // set the property as
-                        // intermediate until we
-                        // find out different
-                    }
-
-                    property.setTypeDescriptor(typeDesc);
-                    property.setReadable(true);
-                    // is only writable if map is not immutable
-                    property.setWritable(!isImmutable());
-                }
-
-                segmentMap.put(segments[0], property);
-            }
-
-            final ITypeDescriptor typeDesc = property.getTypeDescriptor();
-
-            if (typeDesc instanceof IMapTypeDescriptor)
-            {
-                if (segments.length == 1)
-                {
-                    // TODO: not always allowed
-                    // ((IMapTypeDescriptor)typeDesc).getMapSource().put(null,
-                    // source.get(key));
-                    // property is more than simply intermediate
-                    property.setIntermediate(false);
-                } else
-                {
-                    ((IMapTypeDescriptor) typeDesc).getMapSource().put(
-                            key.substring(key.indexOf('.') + 1),
-                            entry.getValue());
-                }
-            }
-        }
-
-        return segmentMap;
-    }
-
-    /**
-     * Based on measurements, this beats Pattern.split by 15-30% even with
-     * a pre-compiled pattern.
-     * 
-     * @param splitValue
-     * @return the array of strings split by the '.' token
-     */
-    private static String[] fastTokenSplit(final String splitValue)
-    {
-        if (splitValue == null || splitValue.length() == 0)
-        {
-            return new String[0];
-        }
-        if (splitValue.indexOf('.') > -1)
-        {
-            return tokenizerSplit(splitValue);
-        }
-        return new String[] {splitValue};
-    }
-
-    private static String[] tokenizerSplit(final String splitValue)
-    {
-        StringTokenizer stringTokenizer = new StringTokenizer(splitValue, ".");
-        // initialize to a large size, since we're just going to truncate
-        // it once at the end and want to reduce the chance of resize during
-        // the loop.
-        final List<String> splitValues = new ArrayList<String>(32);
-
-        while (stringTokenizer.hasMoreTokens())
-        {
-            splitValues.add(stringTokenizer.nextToken());
-        }
-
-        return splitValues.toArray(new String[0]);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the object for the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                return getMapSource();
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                return isImmutable() ? Boolean.TRUE : Boolean.FALSE;
-        }
-        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 SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                setMapSource((Map)newValue);
-                return;
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                setImmutable(((Boolean)newValue).booleanValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                setMapSource(MAP_SOURCE_EDEFAULT);
-                return;
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                setImmutable(IMMUTABLE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if is set
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                return MAP_SOURCE_EDEFAULT == null ? mapSource != null : !MAP_SOURCE_EDEFAULT.equals(mapSource);
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                return immutable != IMMUTABLE_EDEFAULT;
-        }
-        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(" (mapSource: "); //$NON-NLS-1$
-        result.append(mapSource);
-        result.append(", immutable: ");  //$NON-NLS-1$
-        result.append(immutable);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IMapTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.java
deleted file mode 100644
index 2e9a75e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.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.context.symbol.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.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IMethod Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl#getSignature <em>Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IMethodSymbolImpl extends EObjectImpl implements IMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$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 #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String SIGNATURE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected String signature = SIGNATURE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IMethodSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IMETHOD_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method 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, SymbolPackage.IMETHOD_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method signature in JVM/JDT form 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getSignature() {
-        return signature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newSignature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSignature(String newSignature) {
-        String oldSignature = signature;
-        signature = newSignature;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMETHOD_SYMBOL__SIGNATURE, oldSignature, signature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the property as a feature object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                return getSignature();
-        }
-        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 SymbolPackage.IMETHOD_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                setSignature((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                setSignature(SIGNATURE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                return SIGNATURE_EDEFAULT == null ? signature != null : !SIGNATURE_EDEFAULT.equals(signature);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the raw string representation 
-     * <!-- 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(", signature: "); //$NON-NLS-1$
-        result.append(signature);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IMethodSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java
deleted file mode 100644
index 64d314e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java
+++ /dev/null
@@ -1,469 +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.context.symbol.internal.impl;
-
-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.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IProperty Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isWritable <em>Writable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isIntermediate <em>Intermediate</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IPropertySymbolImpl extends EObjectImpl implements IPropertySymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$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 cached value of the '{@link #getTypeDescriptor() <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeDescriptor()
-     * @generated
-     * @ordered
-     */
-    protected ITypeDescriptor typeDescriptor = null;
-
-    
-    /**
-     * Set to true if this property symbol is readable
-     */
-    protected boolean  isReadable = READABLE_EDEFAULT;
-    
-    /**
-     * Set to true if this property symbol is writable
-     */
-    protected boolean  isWritable = WRITABLE_EDEFAULT;
-    
-    /**
-     * The default value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean READABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected boolean readable = READABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean WRITABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected boolean writable = WRITABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isIntermediate() <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isIntermediate()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean INTERMEDIATE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isIntermediate() <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isIntermediate()
-     * @generated
-     * @ordered
-     */
-    protected boolean intermediate = INTERMEDIATE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IPropertySymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eClass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IPROPERTY_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return return the property name
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName the new name of the property 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the property's type descriptor ?? can be null ?? 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ITypeDescriptor getTypeDescriptor() {
-        if (typeDescriptor != null && typeDescriptor.eIsProxy()) {
-            InternalEObject oldTypeDescriptor = (InternalEObject)typeDescriptor;
-            typeDescriptor = (ITypeDescriptor)eResolveProxy(oldTypeDescriptor);
-            if (typeDescriptor != oldTypeDescriptor) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-            }
-        }
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type descriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ITypeDescriptor basicGetTypeDescriptor() {
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeDescriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) {
-        ITypeDescriptor oldTypeDescriptor = typeDescriptor;
-        typeDescriptor = newTypeDescriptor;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if property is readable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isReadable() {
-        return readable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newReadable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setReadable(boolean newReadable) {
-        boolean oldReadable = readable;
-        readable = newReadable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__READABLE, oldReadable, readable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if property is writable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isWritable() {
-        return writable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newWritable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setWritable(boolean newWritable) {
-        boolean oldWritable = writable;
-        writable = newWritable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__WRITABLE, oldWritable, writable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if this property is intermediate and has no value of it's own
-     * besides as a path to it's own properties.  This is used to support the 
-     * situation in JSF where a map-based property can have dots in it (i.e. 
-     * a loadBundle key my.property) and so creates a (discouraged) ambiguous 
-     * situation where a property like #{x.y.z) really corresponds to a key
-     * "y.z" in a property file pointed to by "x" instead of there being an
-     * actual y property on x that has value in and of itself (in this case
-     * "#{x.y}" is invalid even though "#{x.y.z}" is valid). 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isIntermediate() {
-        return intermediate;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newIntermediate 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setIntermediate(boolean newIntermediate) {
-        boolean oldIntermediate = intermediate;
-        intermediate = newIntermediate;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE, oldIntermediate, intermediate));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // TODO: for now, not supported on generic properties
-        return false;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) 
-    {
-        // TODO: for now, no generic property type coercion
-        return getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName) {
-        // TODO: implement this method
-        // Ensure that you remove @generated or mark it @generated NOT
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the eObject for the featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                if (resolve) return getTypeDescriptor();
-                return basicGetTypeDescriptor();
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                return isReadable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                return isWritable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                return isIntermediate() ? Boolean.TRUE : Boolean.FALSE;
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID -- set the feature 
-     * @param newValue 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)newValue);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                setReadable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                setWritable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                setIntermediate(((Boolean)newValue).booleanValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID -- unset the feature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)null);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                setReadable(READABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                setWritable(WRITABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                setIntermediate(INTERMEDIATE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if is set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                return typeDescriptor != null;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                return readable != READABLE_EDEFAULT;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                return writable != WRITABLE_EDEFAULT;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                return intermediate != INTERMEDIATE_EDEFAULT;
-        }
-        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(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", readable: "); //$NON-NLS-1$
-        result.append(readable);
-        result.append(", writable: "); //$NON-NLS-1$
-        result.append(writable);
-        result.append(", intermediate: "); //$NON-NLS-1$
-        result.append(intermediate);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IPropertySymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java
deleted file mode 100644
index b23a303..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java
+++ /dev/null
@@ -1,521 +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.context.symbol.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-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.EDataTypeEList;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-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.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IType Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature <em>Type Signature</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getSuperTypeSignatures <em>Super Type Signatures</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getInterfaceTypeSignatures <em>Interface Type Signatures</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignatureDelegate <em>Type Signature Delegate</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getMethods <em>Methods</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ITypeDescriptorImpl extends EObjectImpl implements ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getTypeSignature() <em>Type Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String TYPE_SIGNATURE_EDEFAULT = ""; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     * @ordered
-     */
-    protected static final String TYPE_SIGNATURE_DELEGATE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     * @ordered
-     */
-    protected String typeSignatureDelegate = TYPE_SIGNATURE_DELEGATE_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getTypeParameterSignatures() <em>Type Parameter Signatures</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeParameterSignatures()
-     * @generated
-     * @ordered
-     */
-    protected EList typeParameterSignatures;
-
-    /**
-     * The default value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected static final IJavaElement JDT_CONTEXT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected IJavaElement jdtContext = JDT_CONTEXT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isEnumType()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean ENUM_TYPE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isEnumType()
-     * @generated
-     * @ordered
-     */
-    protected boolean enumType = ENUM_TYPE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ITypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ITYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return get properties for this type 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getProperties();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type signature in JVM/JDT signature form 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract String getTypeSignature();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the list of super types 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getSuperTypeSignatures();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the list of implemented interfaces
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getInterfaceTypeSignatures();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type signature delegate.  The descriptor may choose to use
-     * this delegate it if it is set and it cannot derive this information
-     * from other properties
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTypeSignatureDelegate() {
-        return typeSignatureDelegate;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeSignatureDelegate 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeSignatureDelegate(String newTypeSignatureDelegate) {
-        String oldTypeSignatureDelegate = typeSignatureDelegate;
-        typeSignatureDelegate = newTypeSignatureDelegate;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE, oldTypeSignatureDelegate, typeSignatureDelegate));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the methods for this type or empty list if none exist 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getMethods();
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getTypeParameterSignatures() {
-        if (typeParameterSignatures == null) {
-            typeParameterSignatures = new EDataTypeEList(String.class, this, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES);
-        }
-        return typeParameterSignatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IJavaElement getJdtContext() {
-        return jdtContext;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setJdtContext(IJavaElement newJdtContext) {
-        IJavaElement oldJdtContext = jdtContext;
-        jdtContext = newJdtContext;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__JDT_CONTEXT, oldJdtContext, jdtContext));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isEnumType() {
-        return enumType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setEnumType(boolean newEnumType) {
-        boolean oldEnumType = enumType;
-        enumType = newEnumType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__ENUM_TYPE, oldEnumType, enumType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * Note about generics:
-     * 
-     * This call mimics the runtime instanceOf to the degree possible.
-     * Therefore, any type parameters (<...>) in typeSignature will be
-     * deleted using Signature.getTypeErasure() since this data won't be
-     * available at runtime.
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean instanceOf(final String typeSignature) 
-    {
-        final String typeErasedSignature = Signature.getTypeErasure(typeSignature);
-        
-        if (Signature.getTypeErasure(getTypeSignature()) != null
-                && Signature.getTypeErasure(getTypeSignature()).equals(typeErasedSignature))
-        {
-            return true;
-        }
-        
-        for (final Iterator it = getSuperTypeSignatures().iterator(); it.hasNext();)
-        {
-            final String superType = (String) it.next();
-            
-            if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
-            {
-                return true;
-            }
-        }
-        
-        for (final Iterator it = getInterfaceTypeSignatures().iterator(); it.hasNext();)
-        {
-            final String superType = (String) it.next();
-            
-            if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
-            {
-                return true;
-            }
-        }
-        
-        return false;
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isArray()
-	{
-		return Signature.getArrayCount(getTypeSignature()) > 0;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public IObjectSymbol getArrayElement() 
-	{
-		if (isArray())
-		{
-			// sub-class of ITypeDescriptor must implement this if they which to provide
-			// array element support
-			throw new UnsupportedOperationException("Base type descriptor does not support this function"); //$NON-NLS-1$
-		}
-		
-		// shouldn't be called if not an array
-		return null;
-	}
-
-    /**
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * Tries to load an IType for a fully resolved (i.e. starts with L not Q)
-     * type signature using the current jdtContext.
-     * 
-     * @return the resolved IType or null if none could be resolved.
-     * 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-      public IType resolveType(String resolvedTypeSignature) 
-      {
-          // we need to obtain an IJavaProject within which to resolve
-          // the type.
-          IJavaProject project = null;
-          
-          // see if a jdtContext hint has been set
-          if (getJdtContext() != null)
-          {
-              project = getJdtContext().getJavaProject();
-          }
-          
-          if (project != null)
-          {
-              return TypeUtil.resolveType(project, resolvedTypeSignature);
-          }
-          
-          return null;
-      }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs, String symbolName) {
-        // sub-classes need only implement if they have something meaningful
-        // the want to do here
-        // by default return null to indicate this type descriptor doesn't
-        // wish to handle calls
-        return null;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return get the feature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                return getProperties();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-                return getTypeSignature();
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                return getSuperTypeSignatures();
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                return getInterfaceTypeSignatures();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                return getTypeSignatureDelegate();
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                return getMethods();
-        }
-        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 SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                getProperties().clear();
-                getProperties().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                getSuperTypeSignatures().clear();
-                getSuperTypeSignatures().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                getInterfaceTypeSignatures().clear();
-                getInterfaceTypeSignatures().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                setTypeSignatureDelegate((String)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                getMethods().clear();
-                getMethods().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                getProperties().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                getSuperTypeSignatures().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                getInterfaceTypeSignatures().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                setTypeSignatureDelegate(TYPE_SIGNATURE_DELEGATE_EDEFAULT);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                getMethods().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if feature has been set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                return !getProperties().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-                return TYPE_SIGNATURE_EDEFAULT == null ? getTypeSignature() != null : !TYPE_SIGNATURE_EDEFAULT.equals(getTypeSignature());
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                return !getSuperTypeSignatures().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                return !getInterfaceTypeSignatures().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                return TYPE_SIGNATURE_DELEGATE_EDEFAULT == null ? typeSignatureDelegate != null : !TYPE_SIGNATURE_DELEGATE_EDEFAULT.equals(typeSignatureDelegate);
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                return !getMethods().isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the debug string format of the type signature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (typeSignatureDelegate: "); //$NON-NLS-1$
-        result.append(typeSignatureDelegate);
-        result.append(')');
-        return result.toString();
-    }
-} //ITypeDescriptorImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/JavaUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/JavaUtil.java
deleted file mode 100644
index d635375..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/JavaUtil.java
+++ /dev/null
@@ -1,104 +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.context.symbol.internal.impl;
-
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.JavadocContentAccess;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-
-/**
- * Utility class for accessing jdt elements for jsf el symbols
- */
-public class JavaUtil {
-
-    private JavaUtil() {
-        // utility class
-    }
-
-    /**
-     * @param method
-     * @return the javadoc text for the given method. Will return null if no javadoc is found
-     */
-    public static String getMethodJavadoc(final IMethod method) {
-        try {
-            final Reader contentReader = JavadocContentAccess.getHTMLContentReader(method, true, true);
-            if (contentReader != null) {
-                return read(contentReader);
-            }
-        } catch (final JavaModelException e) {
-            JSFCommonPlugin.log(IStatus.WARNING, "error reading javadoc for method '" + method.getElementName() + "'.", e); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        return null;
-    }
-
-    private static String read(final Reader rd) {
-        final StringBuffer buffer= new StringBuffer();
-        final char[] readBuffer= new char[2048];
-
-        try {
-            int n= rd.read(readBuffer);
-            while (n > 0) {
-                buffer.append(readBuffer, 0, n);
-                n= rd.read(readBuffer);
-            }
-            return buffer.toString();
-        } catch (final IOException x) {
-            // should not happen, but otherwise simply ignore
-        }
-
-        return null;
-    }
-
-    /**
-     * @param symbol - the method symbol to look for
-     * @return the IMethod for the given method symbol. Will return <code>null</code>, if none is found.
-     */
-    public static IMethod findCorrespondingMethod(final IBeanMethodSymbol symbol) {
-        final IType type = symbol.getOwner().getType();
-        final JDTBeanIntrospector introspector = new JDTBeanIntrospector(type);
-        final IMethod[] methods = introspector.getAllMethods();
-        for (final IMethod method : methods) {
-            if (method.getElementName().equals(symbol.getName())) {
-                try {
-                    final String currentMethodsSignature = TypeUtil.resolveMethodSignature(method.getDeclaringType(),
-                            method.getSignature());
-                    if (currentMethodsSignature.equals(symbol.getSignature())) {
-                        return method;
-                    }
-                } catch (final JavaModelException e) {
-                    JSFCommonPlugin.log(IStatus.WARNING, "error determining for method '" //$NON-NLS-1$
-                            + method.getElementName() + "'.", e); //$NON-NLS-1$
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param propertySymbol - the property symbol to look for
-     * @return a JDTBeanProperty for the given property symbol
-     */
-    public static JDTBeanProperty findCorrespondingJDTProperty(final IBeanPropertySymbol propertySymbol) {
-        final JDTBeanIntrospector introspector = new JDTBeanIntrospector(propertySymbol.getOwner().getType());
-        return introspector.getProperties().get(propertySymbol.getName());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Messages.java
deleted file mode 100644
index f731e4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Messages.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.context.symbol.internal.impl;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/*package*/ class Messages
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.jsf.context.symbol.internal.impl.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-                                                                .getBundle(BUNDLE_NAME);
-
-    private Messages()
-    {
-        // no external instantiation
-    }
-
-    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.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
deleted file mode 100644
index 75c59b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
+++ /dev/null
@@ -1,426 +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.context.symbol.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.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-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.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class SymbolFactoryImpl extends EFactoryImpl implements SymbolFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-	 * @return the SymbolFactory 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static SymbolFactory init() {
-        try {
-            SymbolFactory theSymbolFactory = (SymbolFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/jst/jsf/context/symbol.ecore");  //$NON-NLS-1$
-            if (theSymbolFactory != null) {
-                return theSymbolFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new SymbolFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eClass 
-     * @return the model instace for the model class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL: return createIBeanInstanceSymbol();
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL: return createIBeanPropertySymbol();
-            case SymbolPackage.IINSTANCE_SYMBOL: return createIInstanceSymbol();
-            case SymbolPackage.IJAVA_SYMBOL: return createIJavaSymbol();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2: return createIJavaTypeDescriptor2();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL: return createIBeanMethodSymbol();
-            case SymbolPackage.ICOMPONENT_SYMBOL: return createIComponentSymbol();
-            case SymbolPackage.IPROPERTY_SYMBOL: return createIPropertySymbol();
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR: return createIMapTypeDescriptor();
-            case SymbolPackage.IMETHOD_SYMBOL: return createIMethodSymbol();
-            case SymbolPackage.IBOUNDED_MAP_TYPE_DESCRIPTOR: return createIBoundedMapTypeDescriptor();
-            case SymbolPackage.IBOUNDED_JAVA_TYPE_DESCRIPTOR: return createIBoundedJavaTypeDescriptor();
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR: return createIListTypeDescriptor();
-            case SymbolPackage.IBOUNDED_LIST_TYPE_DESCRIPTOR: return createIBoundedListTypeDescriptor();
-            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 object constructed from the initialValue string 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-        switch (eDataType.getClassifierID()) {
-            case SymbolPackage.ERUNTIME_SOURCE:
-                return createERuntimeSourceFromString(eDataType, initialValue);
-            case SymbolPackage.ITYPE:
-                return createITypeFromString(eDataType, initialValue);
-            case SymbolPackage.IJAVA_ELEMENT:
-                return createIJavaElementFromString(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 equivelent of eDataType for the instance 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-        switch (eDataType.getClassifierID()) {
-            case SymbolPackage.ERUNTIME_SOURCE:
-                return convertERuntimeSourceToString(eDataType, instanceValue);
-            case SymbolPackage.ITYPE:
-                return convertITypeToString(eDataType, instanceValue);
-            case SymbolPackage.IJAVA_ELEMENT:
-                return convertIJavaElementToString(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 a new bean instance symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanInstanceSymbol createIBeanInstanceSymbol() {
-        IBeanInstanceSymbolImpl iBeanInstanceSymbol = new IBeanInstanceSymbolImpl();
-        return iBeanInstanceSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new bean property symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanPropertySymbol createIBeanPropertySymbol() {
-        IBeanPropertySymbolImpl iBeanPropertySymbol = new IBeanPropertySymbolImpl();
-        return iBeanPropertySymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IInstanceSymbol createIInstanceSymbol() {
-        IInstanceSymbolImpl iInstanceSymbol = new IInstanceSymbolImpl();
-        return iInstanceSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new java symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaSymbol createIJavaSymbol() {
-        IJavaSymbolImpl iJavaSymbol = new IJavaSymbolImpl();
-        return iJavaSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new java type descriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 createIJavaTypeDescriptor2() {
-        IJavaTypeDescriptor2Impl iJavaTypeDescriptor2 = new IJavaTypeDescriptor2Impl();
-        return iJavaTypeDescriptor2;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new bean method symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanMethodSymbol createIBeanMethodSymbol() {
-        IBeanMethodSymbolImpl iBeanMethodSymbol = new IBeanMethodSymbolImpl();
-        return iBeanMethodSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new component derived symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IComponentSymbol createIComponentSymbol() {
-        IComponentSymbolImpl iComponentSymbol = new IComponentSymbolImpl();
-        return iComponentSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new property symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IPropertySymbol createIPropertySymbol() {
-        IPropertySymbolImpl iPropertySymbol = new IPropertySymbolImpl();
-        return iPropertySymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return create map type descriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IMapTypeDescriptor createIMapTypeDescriptor() {
-        IMapTypeDescriptorImpl iMapTypeDescriptor = new IMapTypeDescriptorImpl();
-        return iMapTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IMethodSymbol createIMethodSymbol() {
-        IMethodSymbolImpl iMethodSymbol = new IMethodSymbolImpl();
-        return iMethodSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedMapTypeDescriptor createIBoundedMapTypeDescriptor() {
-        IBoundedMapTypeDescriptorImpl iBoundedMapTypeDescriptor = new IBoundedMapTypeDescriptorImpl();
-        return iBoundedMapTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedJavaTypeDescriptor createIBoundedJavaTypeDescriptor() {
-        IBoundedJavaTypeDescriptorImpl iBoundedJavaTypeDescriptor = new IBoundedJavaTypeDescriptorImpl();
-        return iBoundedJavaTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IListTypeDescriptor createIListTypeDescriptor() {
-        IListTypeDescriptorImpl iListTypeDescriptor = new IListTypeDescriptorImpl();
-        return iListTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedListTypeDescriptor createIBoundedListTypeDescriptor() {
-        IBoundedListTypeDescriptorImpl iBoundedListTypeDescriptor = new IBoundedListTypeDescriptorImpl();
-        return iBoundedListTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ERuntimeSource createERuntimeSourceFromString(EDataType eDataType, String initialValue) {
-        ERuntimeSource result = ERuntimeSource.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 converted runtime source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertERuntimeSourceToString(EDataType eDataType, Object instanceValue) {
-        return instanceValue == null ? null : instanceValue.toString();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType
-	 * @param initialValue
-	 * @return 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IType createITypeFromString(EDataType eDataType, String initialValue) {
-        return (IType)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the converted string
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertITypeToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return return the java element
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaElement createIJavaElementFromString(EDataType eDataType, String initialValue) {
-        return (IJavaElement)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the converted string 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertIJavaElementToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the value type for the data type 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValueType createValueTypeFromString(EDataType eDataType, String initialValue) {
-        return (ValueType)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the string for the value type 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertValueTypeToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol package 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolPackage getSymbolPackage() {
-        return (SymbolPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return get the symbol package
-	 * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-	public static SymbolPackage getPackage() {
-        return SymbolPackage.eINSTANCE;
-    }
-
-} //SymbolFactoryImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
deleted file mode 100644
index 707b176..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-/**
- * Copyright 2006 Oracle
- *
- * $Id: SymbolPackageImpl.java,v 1.7 2007/09/24 23:25:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.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.impl.EPackageImpl;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-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.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-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.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class SymbolPackageImpl extends EPackageImpl implements SymbolPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanInstanceSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanPropertySymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iInstanceSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iJavaSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iDescribedInDetailEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iJavaTypeDescriptor2EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanMethodSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iComponentSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iPropertySymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iMapTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iMethodSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iObjectSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedMapTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedJavaTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iListTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedListTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EEnum eRuntimeSourceEEnum = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType iTypeEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType iJavaElementEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType valueTypeEDataType = 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.context.symbol.SymbolPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private SymbolPackageImpl() {
-        super(eNS_URI, SymbolFactory.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 symbols package 
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static SymbolPackage init() {
-        if (isInited) return (SymbolPackage)EPackage.Registry.INSTANCE.getEPackage(SymbolPackage.eNS_URI);
-
-        // Obtain or create and register package
-        SymbolPackageImpl theSymbolPackage = (SymbolPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof SymbolPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new SymbolPackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theSymbolPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theSymbolPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theSymbolPackage.freeze();
-
-        return theSymbolPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanInstanceSymbol() {
-        return iBeanInstanceSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanInstanceSymbol_Properties() {
-        return (EReference)iBeanInstanceSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanInstanceSymbol_Methods() {
-        return (EReference)iBeanInstanceSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanPropertySymbol() {
-        return iBeanPropertySymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanPropertySymbol_Owner() {
-        return (EReference)iBeanPropertySymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIInstanceSymbol() {
-        return iInstanceSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIInstanceSymbol_TypeResolved() {
-        return (EAttribute)iInstanceSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIInstanceSymbol_RuntimeSource() {
-        return (EAttribute)iInstanceSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIJavaSymbol() {
-        return iJavaSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaSymbol_JavaElement() {
-        return (EAttribute)iJavaSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getISymbol() {
-        return iSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getISymbol_Name() {
-        return (EAttribute)iSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getITypeDescriptor() {
-        return iTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getITypeDescriptor_Properties() {
-        return (EReference)iTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeSignature() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_SuperTypeSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_InterfaceTypeSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeSignatureDelegate() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getITypeDescriptor_Methods() {
-        return (EReference)iTypeDescriptorEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeParameterSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_JdtContext() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_EnumType() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIDescribedInDetail() {
-        return iDescribedInDetailEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIJavaTypeDescriptor2() {
-        return iJavaTypeDescriptor2EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaTypeDescriptor2_Type() {
-        return (EAttribute)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIJavaTypeDescriptor2_BeanProperties() {
-        return (EReference)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIJavaTypeDescriptor2_BeanMethods() {
-        return (EReference)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaTypeDescriptor2_ArrayCount() {
-        return (EAttribute)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanMethodSymbol() {
-        return iBeanMethodSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanMethodSymbol_Owner() {
-        return (EReference)iBeanMethodSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIComponentSymbol() {
-        return iComponentSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIPropertySymbol() {
-        return iPropertySymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIPropertySymbol_Intermediate() {
-        return (EAttribute)iPropertySymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIMapTypeDescriptor() {
-        return iMapTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMapTypeDescriptor_MapSource() {
-        return (EAttribute)iMapTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMapTypeDescriptor_Immutable() {
-        return (EAttribute)iMapTypeDescriptorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIMethodSymbol() {
-        return iMethodSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMethodSymbol_Signature() {
-        return (EAttribute)iMethodSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIObjectSymbol() {
-        return iObjectSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIObjectSymbol_TypeDescriptor() {
-        return (EReference)iObjectSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIObjectSymbol_Readable() {
-        return (EAttribute)iObjectSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIObjectSymbol_Writable() {
-        return (EAttribute)iObjectSymbolEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedTypeDescriptor() {
-        return iBoundedTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedMapTypeDescriptor() {
-        return iBoundedMapTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedJavaTypeDescriptor() {
-        return iBoundedJavaTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIListTypeDescriptor() {
-        return iListTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIListTypeDescriptor_ListSource() {
-        return (EAttribute)iListTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedListTypeDescriptor() {
-        return iBoundedListTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EEnum getERuntimeSource() {
-        return eRuntimeSourceEEnum;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getIType() {
-        return iTypeEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getIJavaElement() {
-        return iJavaElementEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getValueType() {
-        return valueTypeEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SymbolFactory getSymbolFactory() {
-        return (SymbolFactory)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
-        iBeanInstanceSymbolEClass = createEClass(IBEAN_INSTANCE_SYMBOL);
-        createEReference(iBeanInstanceSymbolEClass, IBEAN_INSTANCE_SYMBOL__PROPERTIES);
-        createEReference(iBeanInstanceSymbolEClass, IBEAN_INSTANCE_SYMBOL__METHODS);
-
-        iBeanPropertySymbolEClass = createEClass(IBEAN_PROPERTY_SYMBOL);
-        createEReference(iBeanPropertySymbolEClass, IBEAN_PROPERTY_SYMBOL__OWNER);
-
-        iInstanceSymbolEClass = createEClass(IINSTANCE_SYMBOL);
-        createEAttribute(iInstanceSymbolEClass, IINSTANCE_SYMBOL__TYPE_RESOLVED);
-        createEAttribute(iInstanceSymbolEClass, IINSTANCE_SYMBOL__RUNTIME_SOURCE);
-
-        iJavaSymbolEClass = createEClass(IJAVA_SYMBOL);
-        createEAttribute(iJavaSymbolEClass, IJAVA_SYMBOL__JAVA_ELEMENT);
-
-        iSymbolEClass = createEClass(ISYMBOL);
-        createEAttribute(iSymbolEClass, ISYMBOL__NAME);
-
-        iTypeDescriptorEClass = createEClass(ITYPE_DESCRIPTOR);
-        createEReference(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__PROPERTIES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_SIGNATURE);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE);
-        createEReference(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__METHODS);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__JDT_CONTEXT);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__ENUM_TYPE);
-
-        iDescribedInDetailEClass = createEClass(IDESCRIBED_IN_DETAIL);
-
-        iJavaTypeDescriptor2EClass = createEClass(IJAVA_TYPE_DESCRIPTOR2);
-        createEAttribute(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__TYPE);
-        createEReference(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES);
-        createEReference(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS);
-        createEAttribute(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT);
-
-        iBeanMethodSymbolEClass = createEClass(IBEAN_METHOD_SYMBOL);
-        createEReference(iBeanMethodSymbolEClass, IBEAN_METHOD_SYMBOL__OWNER);
-
-        iComponentSymbolEClass = createEClass(ICOMPONENT_SYMBOL);
-
-        iPropertySymbolEClass = createEClass(IPROPERTY_SYMBOL);
-        createEAttribute(iPropertySymbolEClass, IPROPERTY_SYMBOL__INTERMEDIATE);
-
-        iMapTypeDescriptorEClass = createEClass(IMAP_TYPE_DESCRIPTOR);
-        createEAttribute(iMapTypeDescriptorEClass, IMAP_TYPE_DESCRIPTOR__MAP_SOURCE);
-        createEAttribute(iMapTypeDescriptorEClass, IMAP_TYPE_DESCRIPTOR__IMMUTABLE);
-
-        iMethodSymbolEClass = createEClass(IMETHOD_SYMBOL);
-        createEAttribute(iMethodSymbolEClass, IMETHOD_SYMBOL__SIGNATURE);
-
-        iObjectSymbolEClass = createEClass(IOBJECT_SYMBOL);
-        createEReference(iObjectSymbolEClass, IOBJECT_SYMBOL__TYPE_DESCRIPTOR);
-        createEAttribute(iObjectSymbolEClass, IOBJECT_SYMBOL__READABLE);
-        createEAttribute(iObjectSymbolEClass, IOBJECT_SYMBOL__WRITABLE);
-
-        iBoundedTypeDescriptorEClass = createEClass(IBOUNDED_TYPE_DESCRIPTOR);
-
-        iBoundedMapTypeDescriptorEClass = createEClass(IBOUNDED_MAP_TYPE_DESCRIPTOR);
-
-        iBoundedJavaTypeDescriptorEClass = createEClass(IBOUNDED_JAVA_TYPE_DESCRIPTOR);
-
-        iListTypeDescriptorEClass = createEClass(ILIST_TYPE_DESCRIPTOR);
-        createEAttribute(iListTypeDescriptorEClass, ILIST_TYPE_DESCRIPTOR__LIST_SOURCE);
-
-        iBoundedListTypeDescriptorEClass = createEClass(IBOUNDED_LIST_TYPE_DESCRIPTOR);
-
-        // Create enums
-        eRuntimeSourceEEnum = createEEnum(ERUNTIME_SOURCE);
-
-        // Create data types
-        iTypeEDataType = createEDataType(ITYPE);
-        iJavaElementEDataType = createEDataType(IJAVA_ELEMENT);
-        valueTypeEDataType = createEDataType(VALUE_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);
-
-        // Add supertypes to classes
-        iBeanInstanceSymbolEClass.getESuperTypes().add(this.getIInstanceSymbol());
-        iBeanInstanceSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iBeanPropertySymbolEClass.getESuperTypes().add(this.getIPropertySymbol());
-        iBeanPropertySymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iInstanceSymbolEClass.getESuperTypes().add(this.getIObjectSymbol());
-        iJavaSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iJavaTypeDescriptor2EClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBeanMethodSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iBeanMethodSymbolEClass.getESuperTypes().add(this.getIMethodSymbol());
-        iComponentSymbolEClass.getESuperTypes().add(this.getIInstanceSymbol());
-        iComponentSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iPropertySymbolEClass.getESuperTypes().add(this.getIObjectSymbol());
-        iMapTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iMethodSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iObjectSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iBoundedTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBoundedMapTypeDescriptorEClass.getESuperTypes().add(this.getIMapTypeDescriptor());
-        iBoundedMapTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-        iBoundedJavaTypeDescriptorEClass.getESuperTypes().add(this.getIJavaTypeDescriptor2());
-        iBoundedJavaTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-        iListTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBoundedListTypeDescriptorEClass.getESuperTypes().add(this.getIListTypeDescriptor());
-        iBoundedListTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(iBeanInstanceSymbolEClass, IBeanInstanceSymbol.class, "IBeanInstanceSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanInstanceSymbol_Properties(), this.getIBeanPropertySymbol(), null, "properties", null, 0, -1, IBeanInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIBeanInstanceSymbol_Methods(), this.getIBeanMethodSymbol(), null, "methods", null, 0, -1, IBeanInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        addEOperation(iBeanInstanceSymbolEClass, this.getIJavaTypeDescriptor2(), "getJavaTypeDescriptor", 0, 1);
-
-        EOperation op = addEOperation(iBeanInstanceSymbolEClass, null, "setJavaTypeDescriptor");
-        addEParameter(op, this.getIJavaTypeDescriptor2(), "newTypeDescriptor", 0, 1);
-
-        initEClass(iBeanPropertySymbolEClass, IBeanPropertySymbol.class, "IBeanPropertySymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanPropertySymbol_Owner(), this.getIJavaTypeDescriptor2(), null, "owner", null, 0, 1, IBeanPropertySymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iInstanceSymbolEClass, IInstanceSymbol.class, "IInstanceSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIInstanceSymbol_TypeResolved(), ecorePackage.getEBoolean(), "typeResolved", null, 0, 1, IInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIInstanceSymbol_RuntimeSource(), this.getERuntimeSource(), "runtimeSource", "TAG_INSTANTIATED_SYMBOL", 0, 1, IInstanceSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iJavaSymbolEClass, IJavaSymbol.class, "IJavaSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIJavaSymbol_JavaElement(), this.getIJavaElement(), "javaElement", null, 0, 1, IJavaSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iSymbolEClass, ISymbol.class, "ISymbol", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getISymbol_Name(), ecorePackage.getEString(), "name", null, 0, 1, ISymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iTypeDescriptorEClass, ITypeDescriptor.class, "ITypeDescriptor", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getITypeDescriptor_Properties(), this.getIPropertySymbol(), null, "properties", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeSignature(), ecorePackage.getEString(), "typeSignature", "", 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_SuperTypeSignatures(), ecorePackage.getEString(), "superTypeSignatures", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_InterfaceTypeSignatures(), ecorePackage.getEString(), "interfaceTypeSignatures", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeSignatureDelegate(), ecorePackage.getEString(), "typeSignatureDelegate", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getITypeDescriptor_Methods(), this.getIMethodSymbol(), null, "methods", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeParameterSignatures(), ecorePackage.getEString(), "typeParameterSignatures", null, 0, -1, ITypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_JdtContext(), this.getIJavaElement(), "jdtContext", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_EnumType(), ecorePackage.getEBoolean(), "enumType", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        op = addEOperation(iTypeDescriptorEClass, ecorePackage.getEBoolean(), "instanceOf", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        addEOperation(iTypeDescriptorEClass, ecorePackage.getEBoolean(), "isArray", 0, 1);
-
-        addEOperation(iTypeDescriptorEClass, this.getIObjectSymbol(), "getArrayElement", 0, 1);
-
-        op = addEOperation(iTypeDescriptorEClass, this.getIType(), "resolveType", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "resolvedTypeSignature", 0, 1);
-
-        op = addEOperation(iTypeDescriptorEClass, this.getISymbol(), "calculateSyntheticCall", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "methodName", 0, 1);
-        addEParameter(op, this.getValueType(), "methodArgs", 0, -1);
-        addEParameter(op, ecorePackage.getEString(), "symbolName", 0, 1);
-
-        initEClass(iDescribedInDetailEClass, IDescribedInDetail.class, "IDescribedInDetail", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iJavaTypeDescriptor2EClass, IJavaTypeDescriptor2.class, "IJavaTypeDescriptor2", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIJavaTypeDescriptor2_Type(), this.getIType(), "type", null, 0, 1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIJavaTypeDescriptor2_BeanProperties(), this.getIBeanPropertySymbol(), null, "beanProperties", null, 0, -1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIJavaTypeDescriptor2_BeanMethods(), this.getIBeanPropertySymbol(), null, "beanMethods", null, 0, -1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIJavaTypeDescriptor2_ArrayCount(), ecorePackage.getEInt(), "arrayCount", null, 0, 1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iBeanMethodSymbolEClass, IBeanMethodSymbol.class, "IBeanMethodSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanMethodSymbol_Owner(), this.getIJavaTypeDescriptor2(), null, "owner", null, 0, 1, IBeanMethodSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iComponentSymbolEClass, IComponentSymbol.class, "IComponentSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iPropertySymbolEClass, IPropertySymbol.class, "IPropertySymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIPropertySymbol_Intermediate(), ecorePackage.getEBoolean(), "intermediate", null, 0, 1, IPropertySymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iMapTypeDescriptorEClass, IMapTypeDescriptor.class, "IMapTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIMapTypeDescriptor_MapSource(), ecorePackage.getEMap(), "mapSource", null, 0, 1, IMapTypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIMapTypeDescriptor_Immutable(), ecorePackage.getEBoolean(), "immutable", "true", 0, 1, IMapTypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iMethodSymbolEClass, IMethodSymbol.class, "IMethodSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIMethodSymbol_Signature(), ecorePackage.getEString(), "signature", null, 0, 1, IMethodSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iObjectSymbolEClass, IObjectSymbol.class, "IObjectSymbol", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIObjectSymbol_TypeDescriptor(), this.getITypeDescriptor(), null, "typeDescriptor", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIObjectSymbol_Readable(), ecorePackage.getEBoolean(), "readable", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIObjectSymbol_Writable(), ecorePackage.getEBoolean(), "writable", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        op = addEOperation(iObjectSymbolEClass, ecorePackage.getEBoolean(), "supportsCoercion", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iObjectSymbolEClass, this.getITypeDescriptor(), "coerce", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iObjectSymbolEClass, this.getISymbol(), "call", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "methodName", 0, 1);
-        addEParameter(op, this.getValueType(), "methodArguments", 0, -1);
-        addEParameter(op, ecorePackage.getEString(), "symbolName", 0, 1);
-
-        initEClass(iBoundedTypeDescriptorEClass, IBoundedTypeDescriptor.class, "IBoundedTypeDescriptor", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        op = addEOperation(iBoundedTypeDescriptorEClass, ecorePackage.getEBoolean(), "isUnboundedForType", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iBoundedTypeDescriptorEClass, this.getISymbol(), "getUnboundedProperty", 0, 1);
-        addEParameter(op, ecorePackage.getEJavaObject(), "name", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        initEClass(iBoundedMapTypeDescriptorEClass, IBoundedMapTypeDescriptor.class, "IBoundedMapTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iBoundedJavaTypeDescriptorEClass, IBoundedJavaTypeDescriptor.class, "IBoundedJavaTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iListTypeDescriptorEClass, IListTypeDescriptor.class, "IListTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIListTypeDescriptor_ListSource(), ecorePackage.getEEList(), "listSource", null, 0, 1, IListTypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iBoundedListTypeDescriptorEClass, IBoundedListTypeDescriptor.class, "IBoundedListTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        // Initialize enums and add enum literals
-        initEEnum(eRuntimeSourceEEnum, ERuntimeSource.class, "ERuntimeSource");
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.MANAGED_BEAN_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.OTHER_LITERAL);
-
-        // Initialize data types
-        initEDataType(iTypeEDataType, IType.class, "IType", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-        initEDataType(iJavaElementEDataType, IJavaElement.class, "IJavaElement", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-        initEDataType(valueTypeEDataType, ValueType.class, "ValueType", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-
-        // Create resource
-        createResource(eNS_URI);
-    }
-
-} //SymbolPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
deleted file mode 100644
index 0c2f288..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
+++ /dev/null
@@ -1,191 +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.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-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.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-
-final class Util 
-{
-    static ISymbol call(String methodName, EList methodArguments,
-            String symbolName, ITypeDescriptor typeDesc)
-    {
-        // first, see if the type descriptor wants to handle the call
-        ISymbol result = typeDesc.calculateSyntheticCall(methodName, methodArguments, symbolName);
-
-        final IType type= typeDesc.resolveType(typeDesc.getTypeSignature());
-        
-        // if the type is resolved and the typeDesc didn't already handle
-        // the call then do this the hard way...
-        if (type != null && result == null)
-        {
-            final JDTBeanIntrospector introspector = 
-                new JDTBeanIntrospector(type);
-
-            final IMethod callMethod = 
-                Util.matchMethod(methodName, methodArguments, introspector.getAllMethods(),typeDesc.getTypeParameterSignatures());
-
-            if (callMethod != null)
-            {
-                try 
-                {
-                    // resolve the method's return type; don't erase parameters
-                    String retTypeSignature = callMethod.getReturnType();
-                        
-                    // if we have a type variable, try to parameter match it
-                    if (Signature.getTypeSignatureKind(retTypeSignature) == Signature.TYPE_VARIABLE_SIGNATURE)
-                    {
-                        retTypeSignature = TypeUtil.matchTypeParameterToArgument
-                            (type
-                               , retTypeSignature, typeDesc.getTypeParameterSignatures());
-                        
-                        if (retTypeSignature == null)
-                        {
-                            retTypeSignature = TypeConstants.TYPE_JAVAOBJECT;
-                        }
-                    }
-                    // otherwise, try and resolve it in type
-                    else
-                    {
-                    	retTypeSignature = TypeUtil.resolveTypeSignature
-                    		(type, callMethod.getReturnType(), false);
-                    }
-
-                    final IPropertySymbol  propSymbol = 
-                        SymbolFactory.eINSTANCE.createIPropertySymbol();
-
-                    // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName);
-                    propSymbol.setReadable(true);
-                    
-                    {
-                        IJavaTypeDescriptor2 newTypeDesc = null;
-                        
-                        if (retTypeSignature.equals(TypeConstants.TYPE_JAVAOBJECT))
-                        {
-                            newTypeDesc = SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-                        }
-                        else
-                        {
-                            newTypeDesc = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                        }
-                        
-                        newTypeDesc.setArrayCount(Signature.getArrayCount(retTypeSignature));
-                        
-                        // may be null
-                        newTypeDesc.setType(typeDesc.resolveType(retTypeSignature));
-                        newTypeDesc.setTypeSignatureDelegate(retTypeSignature);
-                        propSymbol.setTypeDescriptor(newTypeDesc);
-                    }
-                    
-                    result = propSymbol;
-                } 
-                catch (JavaModelException e) 
-                {
-                    JSFCommonPlugin.log(e);
-                    // fall-through and return null result
-                }
-            }
-        }
-
-        return result;
-    }
-
-    static IMethod matchMethod(String methodName, List methodArguments, IMethod[] allMethods, List typeParameterSignatures)
-    {
-//        final List argSigs = convertArgsToSignatures(methodArguments);
-        IMethod matchedMethod = null;
-
-        for (int i = 0; i < allMethods.length; i++)
-        {
-            final IMethod method = allMethods[i];
-            
-            // check for names and argument count match
-            if (method.getParameterTypes().length == methodArguments.size()
-                    && method.getElementName().equals(methodName))
-            {
-                List<String> methods = resolveMethodParameters(method, typeParameterSignatures);
-                
-                // need to verify argument matches
-                boolean isMatched = true;
-                CHECK_ARGUMENTS: for (int j = 0; j < methods.size(); j++)
-                {
-                    final ValueType valueType = (ValueType) methodArguments.get(j);
-
-                    // if the parameters match, or if the method expects an object
-                    // and we have a class
-                    // TODO: there are some cases not supported here like:
-                    // - method name overloading
-                    // - autoboxing primitives
-                    // - certain kinds of parameterized args
-                    if (!methods.get(j).equals(valueType.getSignature())
-                         && !(methods.get(j).equals(TypeConstants.TYPE_JAVAOBJECT)
-                                 && Signature.getTypeSignatureKind(valueType.getSignature())==Signature.CLASS_TYPE_SIGNATURE))
-                    {
-                        // not a match
-                        isMatched = false;
-                        break CHECK_ARGUMENTS;
-                    }
-                }
-                
-                if (isMatched)
-                {
-                    return method;
-                }
-            }
-        }
-
-        return matchedMethod;
-    }
-    
-    static List<String> resolveMethodParameters(IMethod method, List typeParametersSignatures)
-    {
-        List<String>   resolved = new ArrayList<String>();
-        String[] parameterTypes = method.getParameterTypes();
-        for (String parameter : parameterTypes)
-        { 
-            parameter = TypeUtil.resolveTypeSignature(method.getDeclaringType()
-                    , parameter, false);
-            
-            if (Signature.getTypeSignatureKind(parameter) == Signature.TYPE_VARIABLE_SIGNATURE)
-            {
-                parameter = TypeUtil.matchTypeParameterToArgument
-                    (method.getDeclaringType(), parameter, typeParametersSignatures);
-            }
-            
-            if (parameter == null)
-            {
-                parameter = TypeConstants.TYPE_JAVAOBJECT;
-            }
-            
-            resolved.add(parameter);
-        }
-        
-        return resolved;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/messages.properties
deleted file mode 100644
index ab418ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/messages.properties
+++ /dev/null
@@ -1,17 +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
-###############################################################################
-IBeanPropertySymbolImpl.Access=Access: 
-IBeanPropertySymbolImpl.hiding=hiding
-IBeanPropertySymbolImpl.none=none
-IBeanPropertySymbolImpl.read_write=read/write
-IBeanPropertySymbolImpl.readonly=read-only
-IBeanPropertySymbolImpl.Type=Type: 
-IBeanPropertySymbolImpl.writeonly=write-only
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java
deleted file mode 100644
index ee8e4b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java
+++ /dev/null
@@ -1,219 +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.context.symbol.internal.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.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanInstanceSymbolItemProvider
-	extends IInstanceSymbolItemProvider
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IContentProposalProvider 
-{
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanInstanceSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPropertiesPropertyDescriptor(object);
-			addMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanInstanceSymbol_properties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanInstanceSymbol_properties_feature", "_UI_IBeanInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL__PROPERTIES,
-				 false,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanInstanceSymbol_methods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanInstanceSymbol_methods_feature", "_UI_IBeanInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL__METHODS,
-				 false,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanInstanceSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBeanInstanceSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if not found
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IBeanInstanceSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBeanInstanceSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-	/**
-	 * @param target_
-	 * @param proposalFactory 
-	 * @return a completion proposal for target at offset
-	 */
-	public ICompletionProposal[] getProposals(Object target_, 
-                                          IProposalCreationFactory proposalFactory) 
-	{
-		IBeanInstanceSymbol  symbol = (IBeanInstanceSymbol) target_;
-
-		final String replacementText = symbol.getName();
-		final String displayText = getText(symbol);
-		final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-		
-		return new ICompletionProposal[]
-		{
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java
deleted file mode 100644
index ed4eaae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java
+++ /dev/null
@@ -1,254 +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.context.symbol.internal.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.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanMethodSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanMethodSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addSignaturePropertyDescriptor(object);
-			addOwnerPropertyDescriptor(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_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMethodSymbol_signature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMethodSymbol_signature_feature", "_UI_IMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMETHOD_SYMBOL__SIGNATURE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Owner feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOwnerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanMethodSymbol_owner_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanMethodSymbol_owner_feature", "_UI_IBeanMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_METHOD_SYMBOL__OWNER,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanMethodSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if no found
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBeanMethodSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with label or null if not found 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IBeanMethodSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBeanMethodSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IBeanMethodSymbol.class)) {
-			case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-			case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object          target_, 
-                                              IProposalCreationFactory  proposalFactory) 
-    {
-        IBeanMethodSymbol  symbol = (IBeanMethodSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(target_);
-        final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-        
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java
deleted file mode 100644
index 200d694..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java
+++ /dev/null
@@ -1,196 +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.context.symbol.internal.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.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanPropertySymbolItemProvider
-	extends IPropertySymbolItemProvider
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IContentProposalProvider
-{
-	private static final String PROPERTY_SYMBOL_WO = "full/obj16/IBeanPropertySymbol_wo";
-	private static final String PROPERTY_SYMBOL_RO = "full/obj16/IBeanPropertySymbol_ro";
-	private static final String PROPERTY_SYMBOL_RW = "full/obj16/IBeanPropertySymbol_rw";
-	private static final String PROPERTY_SYMBOL_WO_INDEXABLE = "full/obj16/IBeanPropertySymbol_wo_indexable";
-	private static final String PROPERTY_SYMBOL_RO_INDEXABLE = "full/obj16/IBeanPropertySymbol_ro_indexable";
-	private static final String PROPERTY_SYMBOL_RW_INDEXABLE = "full/obj16/IBeanPropertySymbol_rw_indexable";
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * @extends IContentProposalProvider
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanPropertySymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addOwnerPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Owner feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOwnerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanPropertySymbol_owner_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanPropertySymbol_owner_feature", "_UI_IBeanPropertySymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_PROPERTY_SYMBOL__OWNER,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanPropertySymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		IBeanPropertySymbol propertySymbol = (IBeanPropertySymbol) object;
-		String imageFile = null;
-		ITypeDescriptor typeDescriptor = propertySymbol.getTypeDescriptor();
-		if (typeDescriptor != null && (typeDescriptor.isArray() || typeDescriptor.instanceOf("Ljava.util.List;") || typeDescriptor.instanceOf("Ljava.util.Map;"))) {
-			// property is somehow "indexable" by int/String:
-			if (propertySymbol.isReadable() && propertySymbol.isWritable()) {
-				imageFile = PROPERTY_SYMBOL_RW_INDEXABLE;
-			} else if (propertySymbol.isReadable()) {
-				imageFile = PROPERTY_SYMBOL_RO_INDEXABLE;
-			} else if (propertySymbol.isWritable()) {
-				imageFile = PROPERTY_SYMBOL_WO_INDEXABLE;
-			}
-		} else {
-			if (propertySymbol.isReadable() && propertySymbol.isWritable()) {
-				imageFile = PROPERTY_SYMBOL_RW;
-			} else if (propertySymbol.isReadable()) {
-				imageFile = PROPERTY_SYMBOL_RO;
-			} else if (propertySymbol.isWritable()) {
-				imageFile = PROPERTY_SYMBOL_WO;
-			}
-		}
-		return imageFile == null? null : overlayImage(object, getResourceLocator().getImage(imageFile));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object
- 	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IBeanPropertySymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBeanPropertySymbol_type") : //$NON-NLS-1$
-			getString("_UI_IBeanPropertySymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java
deleted file mode 100644
index 1c85e05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedJavaTypeDescriptorItemProvider.java,v 1.7 2007/10/01 04:29:43 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.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.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.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedJavaTypeDescriptorItemProvider
-    extends IJavaTypeDescriptor2ItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IBoundedJavaTypeDescriptorItemProvider(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 IBoundedJavaTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedJavaTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IBoundedJavaTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBoundedJavaTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IBoundedJavaTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of 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 JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java
deleted file mode 100644
index 4bee1ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,136 +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.context.symbol.internal.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.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.common.JSFCommonPlugin;
-
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedListTypeDescriptorItemProvider
-    extends IListTypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param adapterFactory 
-     * @generated
-     */
-    public IBoundedListTypeDescriptorItemProvider(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 IBoundedListTypeDescriptor.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedListTypeDescriptor")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((IBoundedListTypeDescriptor)object).getTypeSignature();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBoundedListTypeDescriptor_type") : //$NON-NLS-1$
-            getString("_UI_IBoundedListTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return JSFCommonPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java
deleted file mode 100644
index 02b1a24..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedMapTypeDescriptorItemProvider.java,v 1.7 2007/10/01 04:29:43 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.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.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.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedMapTypeDescriptorItemProvider
-    extends IMapTypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IBoundedMapTypeDescriptorItemProvider(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 IBoundedMapTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedMapTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IBoundedMapTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBoundedMapTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IBoundedMapTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of 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 JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.java
deleted file mode 100644
index 96b04f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.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.context.symbol.internal.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.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.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IComponentSymbolItemProvider
-	extends IInstanceSymbolItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider
-{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IComponentSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property descriptor list
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns IComponentSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IComponentSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label for object or null if not found 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IComponentSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IComponentSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object target_, 
-                                       IProposalCreationFactory proposalFactory) 
-    {
-        IComponentSymbol  symbol = (IComponentSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(symbol);
-        final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java
deleted file mode 100644
index 155bfb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java
+++ /dev/null
@@ -1,329 +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.context.symbol.internal.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.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IInstanceSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IInstanceSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the EMF property descriptors  
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addTypeDescriptorPropertyDescriptor(object);
-			addReadablePropertyDescriptor(object);
-			addWritablePropertyDescriptor(object);
-			addTypeResolvedPropertyDescriptor(object);
-			addRuntimeSourcePropertyDescriptor(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_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Descriptor feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeDescriptorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_typeDescriptor_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_typeDescriptor_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__TYPE_DESCRIPTOR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Readable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addReadablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_readable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_readable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__READABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Writable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addWritablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_writable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_writable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__WRITABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Resolved feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeResolvedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IInstanceSymbol_typeResolved_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IInstanceSymbol_typeResolved_feature", "_UI_IInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IINSTANCE_SYMBOL__TYPE_RESOLVED,
-				 false,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Runtime Source feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addRuntimeSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IInstanceSymbol_runtimeSource_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IInstanceSymbol_runtimeSource_feature", "_UI_IInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IINSTANCE_SYMBOL__RUNTIME_SOURCE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IInstanceSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaption for object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IInstanceSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of object 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IInstanceSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IInstanceSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IInstanceSymbol.class)) {
-			case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-			case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-			case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-			case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-			case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object target_, 
-                                    IProposalCreationFactory proposalFactory) 
-    {
-        IInstanceSymbol  symbol = (IInstanceSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(symbol);
-        //final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           null, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java
deleted file mode 100644
index 021cd5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java
+++ /dev/null
@@ -1,204 +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.context.symbol.internal.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.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IJavaSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IJavaSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addJavaElementPropertyDescriptor(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_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Java Element feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addJavaElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaSymbol_javaElement_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaSymbol_javaElement_feature", "_UI_IJavaSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_SYMBOL__JAVA_ELEMENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IJavaSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IJavaSymbol")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if no found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IJavaSymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IJavaSymbol_type") : //$NON-NLS-1$
-			getString("_UI_IJavaSymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IJavaSymbol.class)) {
-			case SymbolPackage.IJAVA_SYMBOL__NAME:
-			case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java
deleted file mode 100644
index 201abe4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java
+++ /dev/null
@@ -1,250 +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.context.symbol.internal.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.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IJavaTypeDescriptor2ItemProvider
-	extends ITypeDescriptorItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IJavaTypeDescriptor2ItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the emf property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTypePropertyDescriptor(object);
-			addBeanPropertiesPropertyDescriptor(object);
-			addBeanMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_type_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_type_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__TYPE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bean Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBeanPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_beanProperties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_beanProperties_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bean Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBeanMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_beanMethods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_beanMethods_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-     * This adds a property descriptor for the Array Count feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param object 
-     * @generated
-     */
-    protected void addArrayCountPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IJavaTypeDescriptor2_arrayCount_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_arrayCount_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-
-    /**
-	 * This returns IJavaTypeDescriptor2.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaption for object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IJavaTypeDescriptor2")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IJavaTypeDescriptor2)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IJavaTypeDescriptor2_type") : //$NON-NLS-1$
-			getString("_UI_IJavaTypeDescriptor2_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IJavaTypeDescriptor2.class)) {
-			case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java
deleted file mode 100644
index 76d3eb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,170 +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.context.symbol.internal.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.ViewerNotification;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IListTypeDescriptorItemProvider
-    extends ITypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IListTypeDescriptorItemProvider(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);
-
-            addListSourcePropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the List Source feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addListSourcePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IListTypeDescriptor_listSource_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_IListTypeDescriptor_listSource_feature", "_UI_IListTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns IListTypeDescriptor.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/IListTypeDescriptor")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((IListTypeDescriptor)object).getTypeSignature();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IListTypeDescriptor_type") : //$NON-NLS-1$
-            getString("_UI_IListTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(IListTypeDescriptor.class)) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                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 JSFCommonPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java
deleted file mode 100644
index 165629c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,204 +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.context.symbol.internal.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.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IMapTypeDescriptorItemProvider
-    extends ITypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IMapTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the prop descriptor 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addMapSourcePropertyDescriptor(object);
-			addImmutablePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Map Source feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addMapSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMapTypeDescriptor_mapSource_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMapTypeDescriptor_mapSource_feature", "_UI_IMapTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Immutable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addImmutablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMapTypeDescriptor_immutable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMapTypeDescriptor_immutable_feature", "_UI_IMapTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR__IMMUTABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IMapTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaptation of the object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IMapTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text rep of the object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IMapTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IMapTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IMapTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IMapTypeDescriptor.class)) {
-			case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-			case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- 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 -->
-     * @return the resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java
deleted file mode 100644
index 0d29021..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java
+++ /dev/null
@@ -1,201 +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.context.symbol.internal.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.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IMethodSymbolItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IMethodSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property sheet descriptors
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addSignaturePropertyDescriptor(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_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMethodSymbol_signature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMethodSymbol_signature_feature", "_UI_IMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMETHOD_SYMBOL__SIGNATURE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IMethodSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image representatino of object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IMethodSymbol")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text represention of object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IMethodSymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IMethodSymbol_type") : //$NON-NLS-1$
-			getString("_UI_IMethodSymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IMethodSymbol.class)) {
-			case SymbolPackage.IMETHOD_SYMBOL__NAME:
-			case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- 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 -->
-     * @return the EMF resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java
deleted file mode 100644
index 3958147..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java
+++ /dev/null
@@ -1,361 +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.context.symbol.internal.provider;
-
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-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.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IPropertySymbolItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource,
-        IContentProposalProvider{
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IPropertySymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property descriptors 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addTypeDescriptorPropertyDescriptor(object);
-			addReadablePropertyDescriptor(object);
-			addWritablePropertyDescriptor(object);
-			addIntermediatePropertyDescriptor(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_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Descriptor feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeDescriptorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_typeDescriptor_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_typeDescriptor_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__TYPE_DESCRIPTOR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Readable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addReadablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_readable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_readable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__READABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Writable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addWritablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_writable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_writable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__WRITABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Intermediate feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIntermediatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IPropertySymbol_intermediate_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IPropertySymbol_intermediate_feature", "_UI_IPropertySymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IPROPERTY_SYMBOL__INTERMEDIATE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IPropertySymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image rep of object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IPropertySymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of the object 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getText(Object object) {
-        String label = ((IPropertySymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IPropertySymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IPropertySymbol.class)) {
-			case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-			case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-			case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-			case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- 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 -->
-     * @return the resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    /**
-     * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-     */
-    public Collection getChildren(Object object) 
-    {
-        final List  childSymbols = new ArrayList();
-        childSymbols.addAll(((IPropertySymbol)object).getTypeDescriptor().getProperties());
-        return Collections.unmodifiableList(childSymbols);
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider#getProposals(Object, org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory)
-     */
-    public ICompletionProposal[] getProposals(Object target1, IProposalCreationFactory proposalFactory) 
-    {
-        return getProposalsInternal((IPropertySymbol) target1, proposalFactory, ""); //$NON-NLS-1$
-    }
-    
-    private ICompletionProposal[] getProposalsInternal(IPropertySymbol symbol, IProposalCreationFactory proposalFactory,  String intermediatePrefix)
-    {
-        final List            completions = new ArrayList();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-            
-        if (symbol.isIntermediate())
-        {
-            // see if there's something using this as intermediate completion
-            List props = symbol.getTypeDescriptor().getProperties();
-            
-            for (final Iterator it = props.iterator(); it.hasNext();)
-            {
-                final IPropertySymbol propSymbol = (IPropertySymbol) it.next();
-
-                if (!propSymbol.isIntermediate())
-                {
-                    final String replacementText = "['" + intermediatePrefix + symbol.getName() + "." + propSymbol.getName() + "']"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                    completions.add(proposalFactory.createProposal(                          
-                                        replacementText, 
-                                        replacementText, 
-                                        null, 
-                                        displayImage, symbol));
-                }
-                else
-                {
-                    completions.addAll(Arrays.asList(getProposalsInternal(propSymbol, proposalFactory, intermediatePrefix+symbol.getName()+"."))); //$NON-NLS-1$
-                }
-            }
-        }
-        else
-        {
-            final String replacementText = intermediatePrefix + symbol.getName();
-            final String displayText = symbol.getName();
-
-            completions.add(createProposal(symbol, replacementText, displayText, displayImage,
-					proposalFactory));
-        }
-        
-        return (ICompletionProposal[]) completions.toArray(new CustomCompletionProposal[0]);
-
-    }
-
-	private ICompletionProposal createProposal(IPropertySymbol symbol,
-			final String replacementText, final String displayText,
-			final Image displayImage, IProposalCreationFactory proposalFactory) {
-		String additionalText = null; // TODO: put property value here where possible?
-        if (symbol instanceof IDescribedInDetail) {
-            additionalText = ((IDescribedInDetail) symbol).getDetailedDescription();
-        }
-		return proposalFactory.createProposal(
-		                                    replacementText, 
-		                                    displayText, 
-		                                    additionalText,
-		                                    displayImage, symbol);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
deleted file mode 100644
index 247422a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,372 +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.context.symbol.internal.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.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ITypeDescriptorItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ITypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPropertiesPropertyDescriptor(object);
-			addTypeSignaturePropertyDescriptor(object);
-			addSuperTypeSignaturesPropertyDescriptor(object);
-			addInterfaceTypeSignaturesPropertyDescriptor(object);
-			addTypeSignatureDelegatePropertyDescriptor(object);
-			addMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_properties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_properties_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__PROPERTIES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_typeSignature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeSignature_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_SIGNATURE,
-				 false,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Super Type Signatures feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSuperTypeSignaturesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_superTypeSignatures_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_superTypeSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Interface Type Signatures feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addInterfaceTypeSignaturesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_interfaceTypeSignatures_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_interfaceTypeSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Signature Delegate feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeSignatureDelegatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_typeSignatureDelegate_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeSignatureDelegate_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_methods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_methods_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__METHODS,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-     * This adds a property descriptor for the Type Parameter Signatures feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addTypeParameterSignaturesPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_typeParameterSignatures_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeParameterSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Jdt Context feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addJdtContextPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_jdtContext_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_jdtContext_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__JDT_CONTEXT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Enum Type feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addEnumTypePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_enumType_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_enumType_feature", "_UI_ITypeDescriptor_type"),
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__ENUM_TYPE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-	 * This returns ITypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ITypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ITypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ITypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_ITypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ITypeDescriptor.class)) {
-			case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-			case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-			case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-			case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- 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 -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java
deleted file mode 100644
index 6dc9171..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,534 +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.context.symbol.internal.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.context.symbol.internal.util.SymbolAdapterFactory;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-
-/**
- * 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 SymbolItemProviderAdapterFactory extends SymbolAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright 2006 Oracle"; //$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 -->
-	 * TODO: try to got to Gen function to add custom adapters
-	 * instead of a NOT
-	 * @generated NOT
-	 */
-	public SymbolItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);
-		supportedTypes.add(IContentProposalProvider.class);
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanInstanceSymbolItemProvider iBeanInstanceSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanInstanceSymbolAdapter() {
-		if (iBeanInstanceSymbolItemProvider == null) {
-			iBeanInstanceSymbolItemProvider = new IBeanInstanceSymbolItemProvider(this);
-		}
-
-		return iBeanInstanceSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanPropertySymbolItemProvider iBeanPropertySymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanPropertySymbolAdapter() {
-		if (iBeanPropertySymbolItemProvider == null) {
-			iBeanPropertySymbolItemProvider = new IBeanPropertySymbolItemProvider(this);
-		}
-
-		return iBeanPropertySymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IInstanceSymbolItemProvider iInstanceSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIInstanceSymbolAdapter() {
-		if (iInstanceSymbolItemProvider == null) {
-			iInstanceSymbolItemProvider = new IInstanceSymbolItemProvider(this);
-		}
-
-		return iInstanceSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IJavaSymbolItemProvider iJavaSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIJavaSymbolAdapter() {
-		if (iJavaSymbolItemProvider == null) {
-			iJavaSymbolItemProvider = new IJavaSymbolItemProvider(this);
-		}
-
-		return iJavaSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IJavaTypeDescriptor2ItemProvider iJavaTypeDescriptor2ItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIJavaTypeDescriptor2Adapter() {
-		if (iJavaTypeDescriptor2ItemProvider == null) {
-			iJavaTypeDescriptor2ItemProvider = new IJavaTypeDescriptor2ItemProvider(this);
-		}
-
-		return iJavaTypeDescriptor2ItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanMethodSymbolItemProvider iBeanMethodSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanMethodSymbolAdapter() {
-		if (iBeanMethodSymbolItemProvider == null) {
-			iBeanMethodSymbolItemProvider = new IBeanMethodSymbolItemProvider(this);
-		}
-
-		return iBeanMethodSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IComponentSymbolItemProvider iComponentSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIComponentSymbolAdapter() {
-		if (iComponentSymbolItemProvider == null) {
-			iComponentSymbolItemProvider = new IComponentSymbolItemProvider(this);
-		}
-
-		return iComponentSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IPropertySymbolItemProvider iPropertySymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the property symbol adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIPropertySymbolAdapter() {
-		if (iPropertySymbolItemProvider == null) {
-			iPropertySymbolItemProvider = new IPropertySymbolItemProvider(this);
-		}
-
-		return iPropertySymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IMapTypeDescriptorItemProvider iMapTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIMapTypeDescriptorAdapter() {
-		if (iMapTypeDescriptorItemProvider == null) {
-			iMapTypeDescriptorItemProvider = new IMapTypeDescriptorItemProvider(this);
-		}
-
-		return iMapTypeDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IMethodSymbolItemProvider iMethodSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter for method symbols 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIMethodSymbolAdapter() {
-		if (iMethodSymbolItemProvider == null) {
-			iMethodSymbolItemProvider = new IMethodSymbolItemProvider(this);
-		}
-
-		return iMethodSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IBoundedMapTypeDescriptorItemProvider iBoundedMapTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIBoundedMapTypeDescriptorAdapter() {
-		if (iBoundedMapTypeDescriptorItemProvider == null) {
-			iBoundedMapTypeDescriptorItemProvider = new IBoundedMapTypeDescriptorItemProvider(this);
-		}
-
-		return iBoundedMapTypeDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IBoundedJavaTypeDescriptorItemProvider iBoundedJavaTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIBoundedJavaTypeDescriptorAdapter() {
-		if (iBoundedJavaTypeDescriptorItemProvider == null) {
-			iBoundedJavaTypeDescriptorItemProvider = new IBoundedJavaTypeDescriptorItemProvider(this);
-		}
-
-		return iBoundedJavaTypeDescriptorItemProvider;
-	}
-
-	/**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IListTypeDescriptorItemProvider iListTypeDescriptorItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createIListTypeDescriptorAdapter() {
-        if (iListTypeDescriptorItemProvider == null) {
-            iListTypeDescriptorItemProvider = new IListTypeDescriptorItemProvider(this);
-        }
-
-        return iListTypeDescriptorItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedListTypeDescriptorItemProvider iBoundedListTypeDescriptorItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createIBoundedListTypeDescriptorAdapter() {
-        if (iBoundedListTypeDescriptorItemProvider == null) {
-            iBoundedListTypeDescriptorItemProvider = new IBoundedListTypeDescriptorItemProvider(this);
-        }
-
-        return iBoundedListTypeDescriptorItemProvider;
-    }
-
-    /**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-     * @return the adapter factory
-	 * <!-- 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 -->
-     * @param parentAdapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param type 
-     * @return true if the factory supports the adapter type 
-	 * <!-- 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 -->
-     * @param notifier 
-     * @param type 
-     * @return the adapter
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @param type 
-     * @return the adapted object 
-	 * <!-- 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 -->
-     * @param notifyChangedListener 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-     * @param notifyChangedListener 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- 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 (iBeanInstanceSymbolItemProvider != null) iBeanInstanceSymbolItemProvider.dispose();
-		if (iBeanPropertySymbolItemProvider != null) iBeanPropertySymbolItemProvider.dispose();
-		if (iInstanceSymbolItemProvider != null) iInstanceSymbolItemProvider.dispose();
-		if (iJavaSymbolItemProvider != null) iJavaSymbolItemProvider.dispose();
-		if (iJavaTypeDescriptor2ItemProvider != null) iJavaTypeDescriptor2ItemProvider.dispose();
-		if (iBeanMethodSymbolItemProvider != null) iBeanMethodSymbolItemProvider.dispose();
-		if (iComponentSymbolItemProvider != null) iComponentSymbolItemProvider.dispose();
-		if (iPropertySymbolItemProvider != null) iPropertySymbolItemProvider.dispose();
-		if (iMapTypeDescriptorItemProvider != null) iMapTypeDescriptorItemProvider.dispose();
-		if (iMethodSymbolItemProvider != null) iMethodSymbolItemProvider.dispose();
-		if (iBoundedMapTypeDescriptorItemProvider != null) iBoundedMapTypeDescriptorItemProvider.dispose();
-		if (iBoundedJavaTypeDescriptorItemProvider != null) iBoundedJavaTypeDescriptorItemProvider.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/source/UnknownTypeContextSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/source/UnknownTypeContextSymbolFactory.java
deleted file mode 100644
index 4a77889..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/source/UnknownTypeContextSymbolFactory.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.context.symbol.internal.source;
-
-import java.util.List;
-
-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.context.symbol.InitializedSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo;
-
-/**
- * Returns an unknown component symbol.
- * 
- * @author cbateman
- * 
- */
-public final class UnknownTypeContextSymbolFactory extends
-AbstractContextSymbolFactory
-{
-    private final InitializedSymbolFactory _factory = new InitializedSymbolFactory();
-
-    @Override
-    protected ISymbol internalCreate(final String symbolName, final int scope,
-            final IAdaptable context, final List problems)
-    {
-        return internalCreate(symbolName, scope, context, null);
-    }
-
-    @Override
-    protected ISymbol internalCreate(final String symbolName, final int scope,
-            final IAdaptable context, final List problems,
-            final IAdditionalContextSymbolInfo info)
-    {
-        return _factory.createUnknownComponentSymbol(symbolName,
-                ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-    }
-    @Override
-    public boolean supports(final IAdaptable context)
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.java
deleted file mode 100644
index ae764be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.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.context.symbol.internal.util;
-
-import org.eclipse.jst.jsf.common.internal.types.MethodType;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-
-/**
- * 
- * @author cbateman
- *
- */
-public class IMethodSymbolBasedType extends MethodType 
-{
-    private final IMethodSymbol _methodSymbol;
-    
-    /**
-     * @param methodSymbol
-     */
-    public IMethodSymbolBasedType(IMethodSymbol  methodSymbol) 
-    {
-        super(methodSymbol.getName(), methodSymbol.getSignature());
-        _methodSymbol = methodSymbol;
-    }
-
-    /**
-     * @return the method symbol
-     */
-    public IMethodSymbol getSymbol()
-    {
-        return _methodSymbol;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.java
deleted file mode 100644
index 04fbe52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.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.context.symbol.internal.util;
-
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * A value type adapter class for IObjectSymbol's
- * 
- * @author cbateman
- *
- */
-public class IObjectSymbolBasedValueType extends ValueType 
-{
-    private final IObjectSymbol _symbol;
-    
-    /**
-     * @param symbol
-     * @return a properly configured instance based on the sub-type of symbol.
-     * Returns null if symbol is not of an appropriate IObjectSymbol type
-     */
-    public static IObjectSymbolBasedValueType getInstance(ISymbol symbol)
-    {
-        if (symbol instanceof IInstanceSymbol)
-        {
-            if (((IInstanceSymbol)symbol).getTypeDescriptor() != null)
-            {
-                return new IObjectSymbolBasedValueType((IInstanceSymbol) symbol);
-            }
-        }
-        else if (symbol instanceof IPropertySymbol)
-        {
-            if (((IPropertySymbol)symbol).getTypeDescriptor() != null)
-            {
-                return new IObjectSymbolBasedValueType((IPropertySymbol) symbol);
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * Constructor for instance symbols (model objects)
-     * @param symbol
-     */
-    public IObjectSymbolBasedValueType(final IInstanceSymbol symbol)
-    {
-        this(symbol.getTypeDescriptor().getTypeSignature(), 
-                (String[])symbol.getTypeDescriptor().getTypeParameterSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getSuperTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getInterfaceTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                symbol.getTypeDescriptor().isEnumType(),
-                IAssignable.ASSIGNMENT_TYPE_RHS /* variables are not assignable */
-                , symbol);
-    }
-    
-    /**
-     * Constructor for property symbols
-     * 
-     * @param symbol
-     */
-    public IObjectSymbolBasedValueType(final IPropertySymbol symbol)
-    {
-        this(symbol.getTypeDescriptor().getTypeSignature(), 
-                (String[])symbol.getTypeDescriptor().getTypeParameterSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getSuperTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getInterfaceTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                symbol.getTypeDescriptor().isEnumType(),
-                    ASSIGNMENT_TYPE_NONE | (symbol.isReadable()?IAssignable.ASSIGNMENT_TYPE_RHS:ASSIGNMENT_TYPE_NONE)|(symbol.isWritable()?IAssignable.ASSIGNMENT_TYPE_LHS:ASSIGNMENT_TYPE_NONE)
-        , symbol);
-    }
-    
-    private IObjectSymbolBasedValueType(final String signature,
-                     final String[] typeArgs,
-                     final String[] superTypes,
-                     final String[] interfaceTypes,
-                     final boolean isEnumType,
-                     final int assignmentMask,
-                     final IObjectSymbol symbol)
-    {
-        super(signature, typeArgs, superTypes, interfaceTypes, isEnumType, assignmentMask);
-        _symbol = symbol;
-    }
-    
-    /**
-     * @return the underlying IObjectSymbol
-     */
-    public IObjectSymbol getSymbol()
-    {
-        return _symbol;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java
deleted file mode 100644
index dcecf36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java
+++ /dev/null
@@ -1,457 +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.context.symbol.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.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.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-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.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- 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.context.symbol.SymbolPackage
- * @generated
- */
-public class SymbolAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static SymbolPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = SymbolPackage.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 SymbolSwitch modelSwitch =
-        new SymbolSwitch() {
-            public Object caseIBeanInstanceSymbol(IBeanInstanceSymbol object) {
-                return createIBeanInstanceSymbolAdapter();
-            }
-            public Object caseIBeanPropertySymbol(IBeanPropertySymbol object) {
-                return createIBeanPropertySymbolAdapter();
-            }
-            public Object caseIInstanceSymbol(IInstanceSymbol object) {
-                return createIInstanceSymbolAdapter();
-            }
-            public Object caseIJavaSymbol(IJavaSymbol object) {
-                return createIJavaSymbolAdapter();
-            }
-            public Object caseISymbol(ISymbol object) {
-                return createISymbolAdapter();
-            }
-            public Object caseITypeDescriptor(ITypeDescriptor object) {
-                return createITypeDescriptorAdapter();
-            }
-            public Object caseIDescribedInDetail(IDescribedInDetail object) {
-                return createIDescribedInDetailAdapter();
-            }
-            public Object caseIJavaTypeDescriptor2(IJavaTypeDescriptor2 object) {
-                return createIJavaTypeDescriptor2Adapter();
-            }
-            public Object caseIBeanMethodSymbol(IBeanMethodSymbol object) {
-                return createIBeanMethodSymbolAdapter();
-            }
-            public Object caseIComponentSymbol(IComponentSymbol object) {
-                return createIComponentSymbolAdapter();
-            }
-            public Object caseIPropertySymbol(IPropertySymbol object) {
-                return createIPropertySymbolAdapter();
-            }
-            public Object caseIMapTypeDescriptor(IMapTypeDescriptor object) {
-                return createIMapTypeDescriptorAdapter();
-            }
-            public Object caseIMethodSymbol(IMethodSymbol object) {
-                return createIMethodSymbolAdapter();
-            }
-            public Object caseIObjectSymbol(IObjectSymbol object) {
-                return createIObjectSymbolAdapter();
-            }
-            public Object caseIBoundedTypeDescriptor(IBoundedTypeDescriptor object) {
-                return createIBoundedTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedMapTypeDescriptor(IBoundedMapTypeDescriptor object) {
-                return createIBoundedMapTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedJavaTypeDescriptor(IBoundedJavaTypeDescriptor object) {
-                return createIBoundedJavaTypeDescriptorAdapter();
-            }
-            public Object caseIListTypeDescriptor(IListTypeDescriptor object) {
-                return createIListTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedListTypeDescriptor(IBoundedListTypeDescriptor object) {
-                return createIBoundedListTypeDescriptorAdapter();
-            }
-            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.context.symbol.IBeanInstanceSymbol <em>IBean Instance Symbol</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.context.symbol.IBeanInstanceSymbol
-     * @generated
-     */
-	public Adapter createIBeanInstanceSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol <em>IBean Property Symbol</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.context.symbol.IBeanPropertySymbol
-     * @generated
-     */
-	public Adapter createIBeanPropertySymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol <em>IInstance Symbol</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.context.symbol.IInstanceSymbol
-     * @generated
-     */
-	public Adapter createIInstanceSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol <em>IJava Symbol</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.context.symbol.IJavaSymbol
-     * @generated
-     */
-	public Adapter createIJavaSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</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.context.symbol.ISymbol
-     * @generated
-     */
-	public Adapter createISymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor <em>IType Descriptor</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.context.symbol.ITypeDescriptor
-     * @generated
-     */
-	public Adapter createITypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</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.context.symbol.IDescribedInDetail
-     * @generated
-     */
-	public Adapter createIDescribedInDetailAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2 <em>IJava Type Descriptor2</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.context.symbol.IJavaTypeDescriptor2
-     * @generated
-     */
-	public Adapter createIJavaTypeDescriptor2Adapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol <em>IBean Method Symbol</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.context.symbol.IBeanMethodSymbol
-     * @generated
-     */
-	public Adapter createIBeanMethodSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol <em>IComponent Symbol</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.context.symbol.IComponentSymbol
-     * @generated
-     */
-	public Adapter createIComponentSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol <em>IProperty Symbol</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.context.symbol.IPropertySymbol
-     * @generated
-     */
-	public Adapter createIPropertySymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor <em>IMap Type Descriptor</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.context.symbol.IMapTypeDescriptor
-     * @generated
-     */
-	public Adapter createIMapTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol <em>IMethod Symbol</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.context.symbol.IMethodSymbol
-     * @generated
-     */
-    public Adapter createIMethodSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</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.context.symbol.IObjectSymbol
-     * @generated
-     */
-    public Adapter createIObjectSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</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.context.symbol.IBoundedTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor <em>IBounded Map Type Descriptor</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.context.symbol.IBoundedMapTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedMapTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor <em>IBounded Java Type Descriptor</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.context.symbol.IBoundedJavaTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedJavaTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor <em>IList Type Descriptor</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.context.symbol.IListTypeDescriptor
-     * @generated
-     */
-    public Adapter createIListTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor <em>IBounded List Type Descriptor</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.context.symbol.IBoundedListTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedListTypeDescriptorAdapter() {
-        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;
-    }
-
-} //SymbolAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java
deleted file mode 100644
index 92c7746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java
+++ /dev/null
@@ -1,579 +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.context.symbol.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-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.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-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.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- 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.context.symbol.SymbolPackage
- * @generated
- */
-public class SymbolSwitch {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static SymbolPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolSwitch() {
-        if (modelPackage == null) {
-            modelPackage = SymbolPackage.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 SymbolPackage.IBEAN_INSTANCE_SYMBOL: {
-                IBeanInstanceSymbol iBeanInstanceSymbol = (IBeanInstanceSymbol)theEObject;
-                Object result = caseIBeanInstanceSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseIInstanceSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanInstanceSymbol);
-                if (result == null) result = caseIObjectSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseISymbol(iBeanInstanceSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL: {
-                IBeanPropertySymbol iBeanPropertySymbol = (IBeanPropertySymbol)theEObject;
-                Object result = caseIBeanPropertySymbol(iBeanPropertySymbol);
-                if (result == null) result = caseIPropertySymbol(iBeanPropertySymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanPropertySymbol);
-                if (result == null) result = caseIObjectSymbol(iBeanPropertySymbol);
-                if (result == null) result = caseISymbol(iBeanPropertySymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IINSTANCE_SYMBOL: {
-                IInstanceSymbol iInstanceSymbol = (IInstanceSymbol)theEObject;
-                Object result = caseIInstanceSymbol(iInstanceSymbol);
-                if (result == null) result = caseIObjectSymbol(iInstanceSymbol);
-                if (result == null) result = caseISymbol(iInstanceSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IJAVA_SYMBOL: {
-                IJavaSymbol iJavaSymbol = (IJavaSymbol)theEObject;
-                Object result = caseIJavaSymbol(iJavaSymbol);
-                if (result == null) result = caseISymbol(iJavaSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ISYMBOL: {
-                ISymbol iSymbol = (ISymbol)theEObject;
-                Object result = caseISymbol(iSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ITYPE_DESCRIPTOR: {
-                ITypeDescriptor iTypeDescriptor = (ITypeDescriptor)theEObject;
-                Object result = caseITypeDescriptor(iTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IDESCRIBED_IN_DETAIL: {
-                IDescribedInDetail iDescribedInDetail = (IDescribedInDetail)theEObject;
-                Object result = caseIDescribedInDetail(iDescribedInDetail);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2: {
-                IJavaTypeDescriptor2 iJavaTypeDescriptor2 = (IJavaTypeDescriptor2)theEObject;
-                Object result = caseIJavaTypeDescriptor2(iJavaTypeDescriptor2);
-                if (result == null) result = caseITypeDescriptor(iJavaTypeDescriptor2);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBEAN_METHOD_SYMBOL: {
-                IBeanMethodSymbol iBeanMethodSymbol = (IBeanMethodSymbol)theEObject;
-                Object result = caseIBeanMethodSymbol(iBeanMethodSymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanMethodSymbol);
-                if (result == null) result = caseIMethodSymbol(iBeanMethodSymbol);
-                if (result == null) result = caseISymbol(iBeanMethodSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ICOMPONENT_SYMBOL: {
-                IComponentSymbol iComponentSymbol = (IComponentSymbol)theEObject;
-                Object result = caseIComponentSymbol(iComponentSymbol);
-                if (result == null) result = caseIInstanceSymbol(iComponentSymbol);
-                if (result == null) result = caseIDescribedInDetail(iComponentSymbol);
-                if (result == null) result = caseIObjectSymbol(iComponentSymbol);
-                if (result == null) result = caseISymbol(iComponentSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IPROPERTY_SYMBOL: {
-                IPropertySymbol iPropertySymbol = (IPropertySymbol)theEObject;
-                Object result = caseIPropertySymbol(iPropertySymbol);
-                if (result == null) result = caseIObjectSymbol(iPropertySymbol);
-                if (result == null) result = caseISymbol(iPropertySymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR: {
-                IMapTypeDescriptor iMapTypeDescriptor = (IMapTypeDescriptor)theEObject;
-                Object result = caseIMapTypeDescriptor(iMapTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iMapTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IMETHOD_SYMBOL: {
-                IMethodSymbol iMethodSymbol = (IMethodSymbol)theEObject;
-                Object result = caseIMethodSymbol(iMethodSymbol);
-                if (result == null) result = caseISymbol(iMethodSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IOBJECT_SYMBOL: {
-                IObjectSymbol iObjectSymbol = (IObjectSymbol)theEObject;
-                Object result = caseIObjectSymbol(iObjectSymbol);
-                if (result == null) result = caseISymbol(iObjectSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_TYPE_DESCRIPTOR: {
-                IBoundedTypeDescriptor iBoundedTypeDescriptor = (IBoundedTypeDescriptor)theEObject;
-                Object result = caseIBoundedTypeDescriptor(iBoundedTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_MAP_TYPE_DESCRIPTOR: {
-                IBoundedMapTypeDescriptor iBoundedMapTypeDescriptor = (IBoundedMapTypeDescriptor)theEObject;
-                Object result = caseIBoundedMapTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseIMapTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_JAVA_TYPE_DESCRIPTOR: {
-                IBoundedJavaTypeDescriptor iBoundedJavaTypeDescriptor = (IBoundedJavaTypeDescriptor)theEObject;
-                Object result = caseIBoundedJavaTypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseIJavaTypeDescriptor2(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR: {
-                IListTypeDescriptor iListTypeDescriptor = (IListTypeDescriptor)theEObject;
-                Object result = caseIListTypeDescriptor(iListTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iListTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_LIST_TYPE_DESCRIPTOR: {
-                IBoundedListTypeDescriptor iBoundedListTypeDescriptor = (IBoundedListTypeDescriptor)theEObject;
-                Object result = caseIBoundedListTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseIListTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Instance Symbol</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>IBean Instance Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanInstanceSymbol(IBeanInstanceSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Property Symbol</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>IBean Property Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanPropertySymbol(IBeanPropertySymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IInstance Symbol</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>IInstance Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIInstanceSymbol(IInstanceSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IJava Symbol</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>IJava Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIJavaSymbol(IJavaSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>ISymbol</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>ISymbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseISymbol(ISymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IType Descriptor</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>IType Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseITypeDescriptor(ITypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IDescribed In Detail</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>IDescribed In Detail</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIDescribedInDetail(IDescribedInDetail object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IJava Type Descriptor2</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>IJava Type Descriptor2</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIJavaTypeDescriptor2(IJavaTypeDescriptor2 object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Method Symbol</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>IBean Method Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanMethodSymbol(IBeanMethodSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IComponent Symbol</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>IComponent Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIComponentSymbol(IComponentSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IProperty Symbol</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>IProperty Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIPropertySymbol(IPropertySymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IMap Type Descriptor</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>IMap Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIMapTypeDescriptor(IMapTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IMethod Symbol</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>IMethod Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIMethodSymbol(IMethodSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IObject Symbol</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>IObject Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIObjectSymbol(IObjectSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Type Descriptor</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>IBounded Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedTypeDescriptor(IBoundedTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Map Type Descriptor</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>IBounded Map Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedMapTypeDescriptor(IBoundedMapTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Java Type Descriptor</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>IBounded Java Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedJavaTypeDescriptor(IBoundedJavaTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IList Type Descriptor</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>IList Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIListTypeDescriptor(IListTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded List Type Descriptor</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>IBounded List Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedListTypeDescriptor(IBoundedListTypeDescriptor 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;
-    }
-
-} //SymbolSwitch
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/package-info.java
deleted file mode 100644
index 3e43b14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/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
- *    
- ********************************************************************************/
-
-/**
- * EL symbols framework.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.context.symbol;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java
deleted file mode 100644
index b37344b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java
+++ /dev/null
@@ -1,62 +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.context.symbol.provider;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Adapts an object to appropriate content proposal
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface IContentProposalProvider 
-{
-	/**
-	 * @param target 
-	 * @param proposalFactory 
-	 * @return an content proposal for target or null
-	 * if nothing appropriate can be created
-	 */
-	ICompletionProposal[]  getProposals(Object target, 
-                                        IProposalCreationFactory proposalFactory);
-    
-    /**
-     * Implementors of the class can configure certain aspects of the returned
-     * proposals
-     * 
-     * @author cbateman
-     *
-     */
-    public interface IProposalCreationFactory
-    {
-        /**
-         * @param replacementText  The text to be replaced
-         * @param displayText  The text to be displayed in the assist window
-         * @param additionalText The text to be displayed in the "addition info"
-         *                          or null
-         * @param displayImage The image to be displayed or null
-         * @param sourceObject  The original source object.  Implementors should
-         * make no assumptions (i.e. always test instanceof before casting)
-         * @return a configured completion proposal for the parameters
-         */
-        ICompletionProposal createProposal(final String  replacementText,
-                final String  displayText,
-                final String  additionalText,
-                final Image   displayImage,
-                final Object  sourceObject);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.java
deleted file mode 100644
index 588a48b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.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.context.symbol.provider;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-
-/**
- * Default implementation of the proposal creation factory
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ProposalCreationFactoryAdapter implements IProposalCreationFactory 
-{
-    /**
-     * The absolute document offset where the replacement is to occur
-     */
-    protected final int       _replacementOffset;
-    /**
-     * The number of characters to replace starting from _replaceOffset with
-     * the proposal.  0 indicates insertion with no replacement
-     */
-    protected final int       _replacementLength;
-    
-    /**
-     * @param replacementOffset -- the absolute document offset to do the replacement
-     * @param replacementLength  -- the number of characters to replace or 0
-     * for insert without any replacement
-     */
-    public ProposalCreationFactoryAdapter(final int replacementOffset,
-                                          final int replacementLength)
-    {
-        _replacementOffset = replacementOffset;
-        _replacementLength = replacementLength;
-    }
-
-    public ICompletionProposal createProposal(String replacementText, 
-                String displayText, String additionalText, Image displayImage,
-                Object targetObject) 
-                
-    {
-        return createDefaultProposal(replacementText, 
-                _replacementOffset, 
-                _replacementLength, 
-                replacementText.length(), 
-                displayImage, 
-                displayText, 
-                null, 
-                additionalText,
-                1);
-    }
-    
-    /**
-     * Simple factory method for creating a default proposal
-     * 
-     * @param replacementText
-     * @param replacementOffset
-     * @param replacementLength
-     * @param cursorPosition
-     * @param displayImage
-     * @param displayText
-     * @param contextInfo
-     * @param additionalText
-     * @param relevance
-     * @return a default configuration of the completion proposal based on 
-     * the CustomCompletionProposal
-     */
-    protected static ICompletionProposal 
-                    createDefaultProposal(final String replacementText,
-                                          final int replacementOffset,
-                                          final int replacementLength,
-                                          final int cursorPosition,
-                                          final Image displayImage,
-                                          final String displayText,
-                                          final IContextInformation contextInfo,
-                                          final String additionalText,
-                                          final int relevance)
-    {
-        return new CustomCompletionProposal(replacementText, 
-                replacementOffset, 
-                replacementLength, 
-                cursorPosition, 
-                displayImage, 
-                displayText, 
-                contextInfo, 
-                additionalText,
-                relevance);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/package-info.java
deleted file mode 100644
index c1dcf63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/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
- *    
- ********************************************************************************/
-
-/**
- * Extended providers for the EL symbols framework.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.context.symbol.provider;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.java
deleted file mode 100644
index 8904e9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Must be sub-classed by all contextSymbolFactory extension point implementors
- * to create context configured symbols
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractContextSymbolFactory
-{
-    /**
-     * @param symbolName -- the symbol name
-     * @param scope -- the scope of the symbol
-     * @param context -- the context; must be supported (call supports(context))
-     * @param problems -- populated with problems found during symbol construction.
-     * @return a new ISymbol configured for the name, scope and context or null
-     * if the arguments are invalid but some other reason a symbol cannot be created.
-     * @throws IllegalArgumentException if this method is called with context
-     * for which supports(context) == false or if scope does not conform
-     * to exactly one of the ISymbolConstants.SYMBOL_SCOPE_* constants
-     * @deprecated Use the new create method instead.
-     */
-    @Deprecated
-    public final ISymbol  create(final String symbolName, final int scope, final IAdaptable context, final List problems)
-    {
-        if (!supports(context))
-        {
-            throw new IllegalArgumentException("Unsupported context"); //$NON-NLS-1$
-        }
-        else if (!ISymbolConstants.isValid(scope))
-        {
-            throw new IllegalArgumentException("Unsupported symbol constant:"+scope); //$NON-NLS-1$
-        }
-
-        try
-        {
-            return internalCreate(symbolName, scope, context, problems, null);
-        }
-        catch (final Exception e)
-        {
-            JSFCommonPlugin.log(e, "During execution of context symbol factory: "+this.getClass().getName());
-            return null;
-        }
-    }
-
-    /**
-     * The same as create(symbolName, scope, context, problems), except it calls
-     * the internalCreate with additionalInfo.  By default this has the same
-     * effect.
-     * 
-     * @param symbolName
-     * @param scope
-     * @param context
-     * @param problems
-     * @param additionalInfo
-     * @return the new Symbol
-     */
-    public final ISymbol  create(final String symbolName, final int scope, final IAdaptable context, final List problems, final IAdditionalContextSymbolInfo additionalInfo)
-    {
-        if (!supports(context))
-        {
-            throw new IllegalArgumentException("Unsupported context"); //$NON-NLS-1$
-        }
-        else if (!ISymbolConstants.isValid(scope))
-        {
-            throw new IllegalArgumentException("Unsupported symbol constant:"+scope); //$NON-NLS-1$
-        }
-
-        try
-        {
-            return internalCreate(symbolName, scope, context, problems, additionalInfo);
-        }
-        catch (final Exception e)
-        {
-            JSFCommonPlugin.log(e, "During execution of context symbol factory: "+this.getClass().getName());
-            return null;
-        }
-    }
-
-
-    /**
-     * Use of this method is DISCOURAGED.  It is preferable to move functionality
-     * to the new internalCreate method and have this one call it with null.
-     * 
-     * This method will eventually be deprecated and removed
-     * 
-     * @param symbolName
-     * @param scope
-     * @param context
-     * @param problems -- see problems arg on create
-     * @return a new ISymbol for the name, scope and context; may return null
-     * @deprecated Use the new internalCreate instead.  Ignore the new
-     * additionalInfo parameter if you do not need it.
-     */
-    @Deprecated
-    protected ISymbol internalCreate(final String symbolName, final int scope, final IAdaptable context, final List problems)
-    {
-        // do nothing by default
-        return null;
-    }
-
-    /**
-     * NOTE: when migrating to this method, ensure that the other internalCreate
-     * method in your implementation doesn't create inconsistent behaviour.
-     * 
-     * @param symbolName
-     * @param scope
-     * @param context Will conform to restrictions you set out in supports().
-     * @param problems CURRENTLY IGNORED.
-     * @param additionalInfo May be null
-     * @since 3.0
-     * @return a new ISymbol for the name, scope and context, but with the option
-     * to also consult additionalInfo passed by the framework.  may return null.
-     */
-    protected ISymbol internalCreate(final String symbolName, final int scope, final IAdaptable context, final List problems, final IAdditionalContextSymbolInfo additionalInfo)
-    {
-        // by default, call the other internalCreate for backward compatibility.
-        // implementers can override to do things with the additional info
-        return internalCreate(symbolName, scope, context, problems);
-    }
-
-    /**
-     * @param context
-     * @return true if this factory supports the context
-     */
-    public abstract boolean  supports(IAdaptable context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.java
deleted file mode 100644
index f793f81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.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.context.symbol.source;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Default implementation of ISymbolSourceProviderFactory.  Implementors may 
- * sub-class or create their own separate factory class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSymbolSourceProviderFactory implements
-        ISymbolSourceProviderFactory 
-{
-    private IProject      _project;
-    
-    /**
-     * Default constructor used by extension manager to create this factory
-     */
-    public AbstractSymbolSourceProviderFactory()
-    {
-        // do nothing
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory#createInstance(org.eclipse.core.resources.IProject)
-     */
-    public final ISymbolSourceProvider createInstance(IProject project) 
-    {
-        _project = project;
-        return create(project);
-    }
-    
-    /**
-     * Override this method to do specialization of provider creation
-     * 
-     * @param project
-     * @return the symbol source provider created by the subclass
-     */
-    protected abstract ISymbolSourceProvider create(IProject project);
- 
-    /**
-     * @return the IProject that this source provider is associated with.
-     */
-    protected final IProject getProject() 
-    {
-        return _project;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/IAdditionalContextSymbolInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/IAdditionalContextSymbolInfo.java
deleted file mode 100644
index ad069e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/IAdditionalContextSymbolInfo.java
+++ /dev/null
@@ -1,38 +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.context.symbol.source;
-
-
-/**
- * Passed to AbstractContextSymbolFactory's to provide additional information.
- * All information is optional and need not be used if not needed.
- * 
- * Clients may use but NOT IMPLEMENT. New methods may be added without notice.
- * 
- * @author cbateman
- * @since 3.0
- *
- */
-public interface IAdditionalContextSymbolInfo
-{
-    /**
-     * @return a suggested symbol type signature.  May be null.
-     */
-    String getSymbolTypeSignature();
-
-    /**
-     * @return the name of the attribute on the current element context that
-     * contains a value expression that may be used to find type information.
-     * May be null.
-     * 
-     */
-    String getValueExpressionAttributeName();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java
deleted file mode 100644
index 590b792..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java
+++ /dev/null
@@ -1,139 +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.context.symbol.source;
-
-/**
- * Defines global constants for symbols
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public class ISymbolConstants {
-    /**
-     * Mask to indicate all request scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_REQUEST = 1;
-    
-    /**
-     * Mask to indicate all session scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_SESSION = 2;
-    
-    /**
-     * Mask to indicate all application scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_APPLICATION = 4;
-    
-    /**
-     * Mask to indicate all 'none' scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_NONE = 8;
-
-    /**
-     * All scopes
-     */
-    public final static int  SYMBOL_SCOPE_ALL = 
-                                                SYMBOL_SCOPE_REQUEST 
-                                                | SYMBOL_SCOPE_SESSION 
-                                                | SYMBOL_SCOPE_APPLICATION 
-                                                | SYMBOL_SCOPE_NONE;
-
-    /**
-     * the string representation for request scope
-     */
-    public final static String SYMBOL_SCOPE_REQUEST_STRING = "request"; //$NON-NLS-1$
-    
-    
-    /**
-     * the string representation for session scope
-     */
-    public final static String SYMBOL_SCOPE_SESSION_STRING = "session"; //$NON-NLS-1$
-
-    /**
-     * the string representation for application scope
-     */
-    public final static String SYMBOL_SCOPE_APPLICATION_STRING = "application"; //$NON-NLS-1$
-
-    /**
-     * the string representation for none scope
-     */
-    public final static String  SYMBOL_SCOPE_NONE_STRING = "none"; //$NON-NLS-1$
-
-    /**
-     * @param scope
-     * @return true iff scope matches exactly one scope value (excluding ALL)
-     */
-    public static boolean isValid(int scope)
-    {
-        return scope  == SYMBOL_SCOPE_APPLICATION
-                   || scope == SYMBOL_SCOPE_REQUEST
-                   || scope == SYMBOL_SCOPE_SESSION
-                   || scope == SYMBOL_SCOPE_NONE;
-    }
-    
-    /**
-     * @param scopeMask
-     * @return the string representation for a scope mask or null if either
-     * the mask contains more than one scope or the scope is not valid
-     */
-    public static String getStringForMask(final int scopeMask)
-    {
-        if (scopeMask == SYMBOL_SCOPE_REQUEST)
-        {
-            return SYMBOL_SCOPE_REQUEST_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_SESSION)
-        {
-            return SYMBOL_SCOPE_SESSION_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_APPLICATION)
-        {
-            return SYMBOL_SCOPE_APPLICATION_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_NONE)
-        {
-            return SYMBOL_SCOPE_NONE_STRING;
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param scopeString
-     * @return the scope mask for the string or -1 if the string is not
-     * one of SYMBOL_SCOPE_*_STRING
-     */
-    public static int getMaskForString(final String scopeString)
-    {
-        if (SYMBOL_SCOPE_REQUEST_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_REQUEST;
-        }
-        else if (SYMBOL_SCOPE_SESSION_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_SESSION;
-        }
-        else if (SYMBOL_SCOPE_APPLICATION_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_APPLICATION;
-        }
-        else if (SYMBOL_SCOPE_NONE_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_NONE;
-        }
-        
-        return -1;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.java
deleted file mode 100644
index 96dae65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Defines a provider that acts as source of symbols.  The
- * implementor is usually context specific
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public interface ISymbolSourceProvider 
-{
-    /**
-	 * @param context 
-     * @param symbolScopeMask - a mask resulting for ORing the SYMBOL_SCOPE_*
-     * constants to indicate what scopes to retrieve symbols for.
-	 * @return all symbols in context matching symbolScopeMask
-	 */
-	ISymbol[]  getSymbols(IAdaptable context, int symbolScopeMask);
-	
-	/**
-	 * @param prefix
-	 * @param context 
-	 * @param symbolScopeMask a mask resulting for ORing the SYMBOL_SCOPE_*
-	 * @return the sub-set of getSymbols that conforms
-	 * to String.startsWith(prefix) in context matching symbolScopeMask.
-	 */
-	ISymbol[]  getSymbols(String prefix, IAdaptable context, int symbolScopeMask);
-	
-	/**
-	 * @param context
-	 * @return true if this provider has symbols for this context
-	 */
-	boolean	   isProvider(IAdaptable context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.java
deleted file mode 100644
index 87b9558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Implemented by extensions wishing to use symbolSourceProvider extension point
- * to contribute designtime symbols to the JSF symbol resolver framework.
- * 
- * Instance factory class must implement a zero-argument default constructor
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public interface ISymbolSourceProviderFactory 
-{
-    /**
-     * @param project
-     * @return a new instance of a symbol source provider for project
-     */
-    ISymbolSourceProvider createInstance(IProject project);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/package-info.java
deleted file mode 100644
index b4a9cc7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/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
- *    
- ********************************************************************************/
-
-/**
- * EL Symbols Framework Extension Point API.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.context.symbol.source;
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 42536dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.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.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 4b178e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,120 +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.1.103.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.2.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,1.2.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.sse.ui;bundle-version="[1.0.101,1.2.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.swt;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;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)"
-Bundle-ActivationPolicy: lazy
-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.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.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.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.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 4802a7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
+++ /dev/null
@@ -1,24 +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,\
-               buildnotes_JSF.html,\
-               .options,\
-               jars/
-src.includes = buildnotes_JSF.html
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html b/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html
deleted file mode 100644
index 6a7db49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>JSF Tools Project Build Notes</title>
-</head>
-<body>
-<h1>JSF Tools Project Build Notes</h1>
-<h4>WTP-JSF 2.0 M5 build</h4>
-<h3>What's new in this drop?</h3>
-<ul>
-	<li>Please see the New and Noteworthy section for a list of new
-	features in the JSF Tools Project. Click on the link titled <b>"
-	New for WTP 2.0 milestone build M4 (January 5, 2007)".</b></li>
-</ul>
-<h3>FAQ</h3>
-<ol>
-	<b><i><li>How to make the Visual Page Designer the default editor for
-	JSP pages?</li></i></b>
-<br>
-	The JSF Tools Project-contributed Visual Page Designer (VPD) is NOT
-	registered as the default editor for JSP files. You can make the VPD
-	the default editor for JSP files by following these steps:
-	<ul>
-		<li>Navigate to "Window" -> "Preferences..." -> "General" ->
-		"Editors" -> "File Associations"</li>
-		<li>In the "File types" section, select "*.jsp"</li>
-		<li>In the "Associated editors" section, select "Web Page Editor"</li>
-		<li>Select the "Default" button</li>
-	</ul>
-
-</ol>
-</body>
-</html>
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 1a5a435..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
+++ /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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - Core
-plugin.provider=Eclipse.org
-plugin.facet.description=Enables the project to be deployed with JSF capabilities.
-
-JSFELValidator=JSP JSF EL Validator
-
-JSFv12Project=JavaServer Faces v1.2 Project
-JSFv12PresetDesc=Configures a Dynamic Web application to use JSF v1.2
-# ====================================================================
-
-pluginName = Constraints Model
-providerName = www.example.org
-
-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
\ 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 1147025..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ /dev/null
@@ -1,375 +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="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>JavaServer Faces</label>
-      <description>%plugin.facet.description</description>
-      <default-version
-            provider="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetDefaultVersionProvider">
-      </default-version>
-    </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> 
-
-    <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" >
-	 	<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">
-	 	<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">
-     <dynamic-preset id="preset.jst.jsf.v1_1">
-       <factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFConfigurationPresetFactory11"/>
-     </dynamic-preset>
-     <static-preset
-           id="preset.jst.jsf.v1_2">
-	    <label>%JSFv12Project</label>
-	    <facet id="jst.java" version="5.0" />
-	    <facet id="jst.web" version="2.5"/>
-	    <facet id="jst.jsf" version="1.2" />
-     <description>
-        %JSFv12PresetDesc
-     </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"/> 
-    </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.ui.startup">
-      <startup class="org.eclipse.jst.jsf.designtime.internal.jsp.StartupHandler"/>
-      <!--
-      <startup
-            class="org.eclipse.jst.jsf.core.internal.RegistryMigrationStartupHandler">
-      </startup>
-      --> 
-   </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="0">
-      </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>
-     </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>
-  
-</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/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 802062f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd
+++ /dev/null
@@ -1,176 +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="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;
-      </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>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </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>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  Translatable string for displaying the library name.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="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>
-            </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 IPaths to jars in the library
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryArchiveFilesDelegate"/>
-               </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>
-         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/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 7e2d9c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.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;
-
-/**
- * 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;
-    
-    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 e1d3aaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.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;
-
-/**
- * @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;
-	
-    @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 UNKNOWN:
-                return "unknown";
-            default:
-                throw new IllegalStateException("Missing string conversion: "+this.name());
-        }
-    }
-
-    /**
-     * @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 ("unknown".equals(valueAsString))
-        {
-            return UNKNOWN;
-        }
-        else
-        {
-            return null;
-        }
-    }
-}
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 a7112b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeTagRegistryFactory.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.core.internal;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-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.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;
-
-    /**
-     * @return the single instance of the registry factory
-     */
-    public static synchronized CompositeTagRegistryFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new CompositeTagRegistryFactory();
-        }
-        return INSTANCE;
-    }
-
-    private final Map<IContentType, Set<TagRegistryFactoryInfo>> _cachedExtensionsByType =
-        new HashMap<IContentType, Set<TagRegistryFactoryInfo>>(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<TagRegistryFactoryInfo> handlers = TagLibraryRegistryLoader
-                .getAllHandlers();
-
-        final Set<TagRegistryFactoryInfo> 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");
-                }
-            }
-            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<TagRegistryFactoryInfo> 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<TagRegistryFactoryInfo> getAllTagRegistryFactories()
-    {
-        return TagLibraryRegistryLoader.getAllHandlers();
-    }
-
-    private Set<TagRegistryFactoryInfo> findMatchingExtensions(
-            TagRegistryIdentifier id, Set<TagRegistryFactoryInfo> handlers)
-    {
-        Set<TagRegistryFactoryInfo> matching = _cachedExtensionsByType.get(id
-                .getContentType());
-
-        if (matching == null)
-        {
-            matching = new HashSet<TagRegistryFactoryInfo>(4);
-
-            for (final TagRegistryFactoryInfo handler : handlers)
-            {
-                if (handler.getContentTypes().contains(id.getContentType()))
-                {
-                    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.getContentType(), matching);
-            }
-            else
-            {
-                _cachedExtensionsByType.put(id.getContentType(),
-                        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;
-        }
-
-        IProject getProject()
-        {
-            return _project;
-        }
-
-        IContentType getContentType()
-        {
-            return _contentType;
-        }
-
-    }
-
-    private static class TagRegistrySelectionStrategy
-            extends
-            IteratorPolicyBasedStrategyComposite<IProject, 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;
-        }
-    }
-}
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/JSFCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
deleted file mode 100644
index eb6ca1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
+++ /dev/null
@@ -1,370 +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$
-
-    // 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());
-        }
-    }
-
-    /**
-     * 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 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 0f27317..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";
-    private static final String KEY_DESIGNTIME = "/designtime";
-    private static final String KEY_DESIGNTIME_VIEW = KEY_DESIGNTIME + "/view";
-    private static final String KEY_VIEW_JSPTAGINTROSPECTOR = KEY_DESIGNTIME_VIEW
-            + "/jsptagintrospection";
-    private static final String KEY_VIEW_JSPTAGINTROSPECTOR_PERF = 
-        KEY_VIEW_JSPTAGINTROSPECTOR + "/perf";
-    private static final String KEY_VIEW_JSPTAGREGISTRY = KEY_DESIGNTIME_VIEW
-            + "/jsptagregistry";
-    private static final String KEY_VIEW_JSPTAGPERSISTENCE = KEY_DESIGNTIME_VIEW
-            + "/jsptagpersistence";
-    private static final String KEY_VIEW_JSPTAGREGISTRY_CHANGES =
-        KEY_VIEW_JSPTAGREGISTRY + "/changes";
-    private static final String KEY_VIEW_JSPTAGREGISTRY_PERF =
-        KEY_VIEW_JSPTAGREGISTRY + "/perf";
-    private static final String KEY_VIEW_TLDREGISTRYMANAGER =
-        KEY_DESIGNTIME_VIEW + "/tldregistrymanager";
-
-    
-    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);
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n");
-    }
-
-    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 d8d443c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java
+++ /dev/null
@@ -1,89 +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
- */
-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 ab3d50c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.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.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
- */
-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 cc3689c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
+++ /dev/null
@@ -1,273 +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 JSFFacetInstallDataModelProvider_ClientImplValidationMsg;
-
-	/**
-	 * 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 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_ValidateJSFImpl;
-    /**
-     * 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 JSFFacet11_presetLabel;
-	
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacet11_presetDescription;
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_InternalErr;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_ConfigErr;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_NonUpdateableWebXML;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetUninstallDelegate_ConfigErr;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetUninstallDelegate_NonUpdateableWebXML;
-
-	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 8e3f0f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java
+++ /dev/null
@@ -1,170 +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
- *
- */
-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, "Serious Error Encountered!", "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.");
-    		}
-    	});
-    }
-    
-    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 8acca06..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";
-    private final static String              ELEMENT_NAME = "tagRegistry";
-
-    private static Set<TagRegistryFactoryInfo> _extensions;
-
-    /**
-     * @return the list of handlers. The list is not modifiable and will throw
-     *         exceptions if it is attempted.
-     */
-    public static synchronized Set<TagRegistryFactoryInfo> getAllHandlers()
-    {
-        if (_extensions == null)
-        {
-            _extensions = readAllHandlers();
-        }
-        return Collections.unmodifiableSet(_extensions);
-
-    }
-
-    private static Set<TagRegistryFactoryInfo> readAllHandlers()
-    {
-        Set<TagRegistryFactoryInfo> result = new HashSet<TagRegistryFactoryInfo>();
-        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: "
-                                        + element.getContributor().getName()
-                                        + "." + element.getAttribute("id"));
-                    }
-                }
-            }
-        }
-        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 ba2901b..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
-{
-    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");
-
-        final String localId = element.getAttribute("id");
-        _id = element.getContributor().getName() + "." + localId;
-
-        _description = element.getAttribute("description");
-
-        final IConfigurationElement[] contentTypes = element
-                .getChildren("content-type");
-
-        final IContentTypeManager typeManager = Platform
-                .getContentTypeManager();
-        _contentTypes = new HashSet<IContentType>();
-        for (IConfigurationElement contentTypeElement : contentTypes)
-        {
-            final String contentTypeId = contentTypeElement
-                    .getAttribute("contentTypeId");
-
-            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/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 1be8de4..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("["))
-            {
-                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/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 ec26cac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jem/BeanProxyUtil.java
+++ /dev/null
@@ -1,352 +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.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;
-
-/**
- * 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 IBeanProxy _instance;
-
-        /**
-         * @param typeProxy
-         */
-        public BeanProxyWrapper(final IBeanTypeProxy typeProxy)
-        {
-            super();
-            _typeProxy = typeProxy;
-        }
-
-        /**
-         * 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 = (argTypes.length == 0) ? _typeProxy
-                        .getMethodProxy(methodName) : _typeProxy
-                        .getMethodProxy(methodName, argTypes);
-
-                if (method != null)
-                {
-                    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
-        {
-            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;
-
-            while (curType != null)
-            {
-                final IBeanProxy field = getFieldValue(fieldName, curType);
-                if (field != null)
-                {
-                    return field;
-                }
-
-                try
-                {
-                    curType = curType.getSuperBeanTypeProxy();
-                }
-                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;
-        }
-    }
-
-    /**
-     * 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 90a04c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
+++ /dev/null
@@ -1,171 +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;
-
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * To construct implementation library and component libraries from sticky values 
- * in DialogSettings as saved libraries.  
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryConfigDialogSettingData implements JSFLibraryConfiglModelSource {
-	/**
-	 * Delimintor for parsing a persistent property string.
-	 */
-	final protected static String SEPARATOR =":";	//$NON-NLS-1$
-
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	final private boolean dftImplLibDeployFlag;
-	private String[] savedCompLibs;
-	private JSFLibraryInternalReference selJSFLibImpl;	// lazy initialized	
-	private List selJSFLibComp;							// lazy initialized
-
-	private IMPLEMENTATION_TYPE implType;
-	
-	
-	/**
-	 * Constructor where implementation type was chosen to be USER_SPECIFIED.  Created for backwards compatibilty when server supplied was not an option.
-	 * @param implLibDeployFlag
-	 * @param compLibs
-	 */
-	public JSFLibraryConfigDialogSettingData(boolean implLibDeployFlag, String[] compLibs) {
-		this(IMPLEMENTATION_TYPE.USER_SPECIFIED, implLibDeployFlag, compLibs);		
-	}
-	
-	/**
-	 * Constructor
-	 * @param implType {@link IMPLEMENTATION_TYPE}
-	 * @param implLibDeployFlag String  valid options are "true" or "false"
-	 * @param compLibs String[]  saved component library settings in string array
-	 * 
-	public JSFLibraryConfigDialogSettingData(String implLibDeployFlag, String[] compLibs) {
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		this.dftImplLibDeployFlag = implLibDeployFlag;
-		this.savedCompLibs = compLibs;
-		
-		// Verify and log a message if a saved component library no longer exists. 
-		verifySavedLibAvailability();
-	}
-	*/
-	public JSFLibraryConfigDialogSettingData(IMPLEMENTATION_TYPE implType, boolean implLibDeployFlag, String[] compLibs) {
-		
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		this.dftImplLibDeployFlag = implLibDeployFlag;
-		this.savedCompLibs = compLibs;
-		this.implType = implType;
-		
-		// Verify and log a message if a saved component library no longer exists. 
-		verifySavedLibAvailability();
-	}	
-	
-	/**
-	 * There is no saved JSFImplLibrary per se if initializing from DialogSettings 
-	 * since default implementation library is always selected and only the 
-	 * deployment flag is saved.  
-	 * 
-	 * A null is returned when there is no default 
-	 * implementation library in registry.
-	 *     
-	 * @return selJSFLibImpl JSFLibraryInternalReference return default implementation library with updated deployment flag 
-	 */
-	public JSFLibraryInternalReference getJSFImplementationLibrary() {
-		if (selJSFLibImpl == null) {
-			// To instanciate a JSFLibraryReferenceUserSpecified object from default impl lib as the saved library.  
-			JSFLibraryInternalReference dftImplLib = jsfLibReg.getDefaultJSFImplementationLibrary(); 		
-			if (dftImplLib != null) {
-				selJSFLibImpl = new JSFLibraryInternalReference(dftImplLib.getLibrary(), 
-						true,	// selected 
-						dftImplLibDeployFlag);
-			}
-		}
-		return selJSFLibImpl;
-	}
-	
-	/**
-	 * 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[]{};
-			}
-		}	
-		
-
- 	}
-	
- 	/**
- 	 * @return {@link IMPLEMENTATION_TYPE}
- 	 */
- 	public IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE getImplementationType(){
- 		return implType;
- 	}
-}
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 6321353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.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:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * 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
- */
-public class JSFLibraryConfigModel {
-	final private JSFLibraryConfiglModelSource data;
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private List colJSFImplLib;
-	private List colJSFCompLib;	
-	
-	/**
-	 * Private constructor.  
-	 * @param data
-	 */
-	private JSFLibraryConfigModel(JSFLibraryConfiglModelSource data) {
-		this.data = data;
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-	}
-		
-	/**
-	 * @return IMPLEMENTATION_TYPE
-	 */
-	public IMPLEMENTATION_TYPE getImplementationType() {
-		return data.getImplementationType();
-	}
-	/**
-	 * Return JSF implementation 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#getProjectJSFImplementationLibraries()
-	 */
-	public List getJSFImplementationLibraries() {
-		if (colJSFImplLib == null) {
-			/* To initialze an implementation library list from registry 
-			 * and then update the list with saved implementation library.
-			 */
-			colJSFImplLib = jsfLibReg.getJSFImplementationLibraries();	
-//			colJSFImplLib.add(JSFLibraryRegistryUtil.getInstance().getServerSuppliedJSFLibrary());
-			JSFLibraryInternalReference targetLib = data.getJSFImplementationLibrary();
-			if (targetLib == null) {
-				// no saved implementation, get default implementation library
-				targetLib = jsfLibReg.getDefaultJSFImplementationLibrary();
-			}
-			if (targetLib != null) {
-				JSFLibraryInternalReference srcLib = jsfLibReg.getJSFLibraryReferencebyID(targetLib.getID());				
-				if (srcLib != null) {
-					srcLib.setSelected(true);
-					srcLib.setToBeDeployed(targetLib.isCheckedToBeDeployed());				
-				}
-			}
-		} 
-		return colJSFImplLib;
-	}
-
-	/**
-	 * 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 implementation library currently.
-	 * A null is returned if none is selected.
-	 * 
-	 * @return JSFLibraryInternalReference 
-	 */
-	public JSFLibraryInternalReference getCurrentJSFImplementationLibrarySelection() {
-		Iterator it = getJSFImplementationLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		while (it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference) it.next();
-			if (crtItem.isSelected()) {
-				return crtItem;
-			}
-		}		
-		return null;
-	}
-	
-	/**
-	 * 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 a saved implementation library which was persisted as 
-	 * DialogSettings or as project properties.
-	 * 
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getSavedJSFImplementationLibrary() {
-		return data.getJSFImplementationLibrary();
-	}
-
-	/**
-	 * Returned saved component libraries which were persisted as 
-	 * DialogSettings or project persistent properties.
-	 *  
-	 * @return List
-	 */
-	public List getSavedJSFComponentLibraries() {
-		return data.getJSFComponentLibraries();
-	}
-	
-	/**
-	 * Update the selected JSF implementation library.
-	 * 
-	 * Note: The library parameter won't be not added into the collection 
-	 * if it does not exist already. 
-	 * 
-	 * @param library JSFLibraryInternalReference
-	 */
-	public void setCurrentJSFImplementationLibrarySelection(final JSFLibraryInternalReference library) {
-		if (library != null) {			
-			Iterator it = getJSFImplementationLibraries().iterator();
-			JSFLibraryInternalReference crtjsflib = null;
-			while (it.hasNext()) {
-				crtjsflib = (JSFLibraryInternalReference) it.next();
-				if (crtjsflib.getID().equals(library.getID())) {
-					crtjsflib.setSelected(true);
-					crtjsflib.setToBeDeployed(library.isCheckedToBeDeployed());
-				} else {
-					crtjsflib.setSelected(false);
-				}
-			}				
-		}
-	}
-
-	/**
-	 * 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());
-				}
-			}		
-		}
-	}
-		
-	/**
-	 * To save current configuration of implementation and component libraries 
-	 * as project properties.
-	 * 
-	 * @param project IProject
-	 */
-	public void saveData(final IProject project) {
-		// Instantiate one to make sure it is for a project.
-		JSFLibraryConfigProjectData data_ = new JSFLibraryConfigProjectData(project);
-		List implLibs = new ArrayList();
-		implLibs.add(getCurrentJSFImplementationLibrarySelection());
-		data_.saveData(implLibs, getCurrentJSFComponentLibrarySelection(), getImplementationType());
-	}	
-	
-	/**
-	 * 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 JSFLibraryConfiglModelSource 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/JSFLibraryConfigProjectData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
deleted file mode 100644
index 70d36dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.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: Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * To construct implementation library and component libraries 
- * from persistent project properties as saved libraries.  
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryConfigProjectData implements JSFLibraryConfiglModelSource {
-	final static String QUALIFIEDNAME = "org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigProjectData"; 
-	/**
-	 * 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 IProject project;
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private JSFLibraryInternalReference selJSFLibImpl;	
-	private List selJSFLibComp;
-
-	/**
-	 * Constructor
-	 * @param project
-	 */
-	public JSFLibraryConfigProjectData(IProject project) {
-		this.project = project;
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		
-		/* logging message when object is instantiated instead of at method call to 
-		 * reduce log entries.
-		 */ 
-		if (!isProjectFirstCreated()) {
-			verifySavedLibAvailability();
-		}		
-	}
-	 	
-	public IMPLEMENTATION_TYPE getImplementationType() {
-		try {
-			String type = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-					JSFUtils.PP_JSF_IMPLEMENTATION_TYPE));
-			return IMPLEMENTATION_TYPE.getValue(type);
-		} catch (CoreException e) {//
-		}
-		return IMPLEMENTATION_TYPE.UNKNOWN;
-	}	
-	
-	/**
-	 * Return the previously selected JSF implementation library from project persistent properties.
-	 * Return null if none exists.
-	 * 
-	 * @return selJSFLibImpl JSFLibraryDecorator
-	 */
- 	public JSFLibraryInternalReference getJSFImplementationLibrary() {
-		try {
-			if (!isProjectFirstCreated() && 
-					selJSFLibImpl == null ) {
-					String strImplLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-							JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-					selJSFLibImpl = getJSFImplLibfromPersistentProperties(getTuples(strImplLibs));
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while returning reference to the JSF implementation library");
-		}
-		return selJSFLibImpl; 
-	}
-	
-	/**
-	 * Return the selected JSF component libraries from project persistent properties.
-	 * An empty List is returned if no JSF component libraries were saved or 
-	 * if the project is newly created.
-	 * 
-	 * @return selJSFLibComp List
-	 */
-	public List getJSFComponentLibraries() {	
-		try {
-			if (!isProjectFirstCreated()) {
-				if ( selJSFLibComp == null ) {
-					selJSFLibComp = new ArrayList();
-					
-					String strCompLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-					List savedList = getTuples(strCompLibs);
-					
-					Iterator it = savedList.iterator();
-					Tuple crtTuple = null;
-					JSFLibraryInternalReference srcItem = null;
-					while (it.hasNext()) {
-						crtTuple = (Tuple) it.next();
-						
-						srcItem = jsfLibReg.getJSFLibraryReferencebyID(crtTuple.getID());
-						if (srcItem != null) {
-							selJSFLibComp.add( new JSFLibraryInternalReference(srcItem.getLibrary(), 
-													true, 
-													crtTuple.needDeploy()) );
-						} /*else {
-							// already logged a message for a missing library
-						}*/
-					}
-				}		
-			} else {
-				selJSFLibComp = new ArrayList(0);  
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while returning references to the JSF component libraries.");
-		}
-		return selJSFLibComp;
-	}
-	
-	/**
-	 * To save configuration data as a project persistent properties.
-	 * 
-	 * @param implementation
-	 * @param component
-	 */
-	void saveData(final List implementation, final List component, final IMPLEMENTATION_TYPE implType) {
-		try {
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES), generatePersistString(implementation));
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES), generatePersistString(component));
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_TYPE), IMPLEMENTATION_TYPE.getStringValue(implType));
-			
-			/* Flush the selection so that they can be reconstructed from 
-			 * persistent properties when getSavedJSFImplLib and getSavedJSFCompLibs 
-			 * called next time.
-			 */
-			selJSFLibImpl = null;
-			selJSFLibComp = null;
-			
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while persisting the JSF Library preferences");
-		}
-	}
-	
-	/**
-	 * Check if a project is just created by inspecting persistent properties    
-	 * if there is any.  ?
-	 */
- 	private boolean isProjectFirstCreated() {
- 		boolean isNew = false;
- 		try {
-			((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-														JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-		} catch (CoreException e) {
-			isNew = true;
-		}
-		return isNew;
- 	}
-	
- 	private void verifySavedLibAvailability() {
- 		try {
-			String strImplLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-	 		String strCompLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-	 		
-	 		logMissingLib(getTuples(strImplLibs), true);
-	 		logMissingLib(getTuples(strCompLibs), false);
-	 		
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while verifying saved JSF Library preferences");
-		}		
- 	} 	
- 	
- 	private void logMissingLib(final List jsfLibTuples, final boolean isVerifyImpl) {
-		if (jsfLibReg != null) {
-			Iterator itTuple = jsfLibTuples.iterator();
-			while(itTuple.hasNext()) {
-				Tuple tuple = (Tuple)itTuple.next();			
-				JSFLibraryInternalReference jsfLib = jsfLibReg.getJSFLibraryReferencebyID(tuple.getID());				
-				/* Information logged when saved JSF lib is removed from registry.
-				 * One log entry is created for each missing library.
-				 */
-				if (jsfLib == null) {
-					String prjName = project.getName();
-					String msg = (isVerifyImpl) ?
-							Messages.JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND : 
-							Messages.JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND;
-					JSFCorePlugin.log(IStatus.INFO, NLS.bind(msg, prjName));
-				}
-			}
-		} 		
- 	}	
-	
-	private JSFLibraryInternalReference getJSFImplLibfromPersistentProperties(final List jsfLibTuples) {
-		if (jsfLibReg != null) {			
-			Tuple tuple = null;
-			JSFLibraryInternalReference lib = null;
-			Iterator itTuple = jsfLibTuples.iterator();			
-			while(itTuple.hasNext()) {
-				tuple = (Tuple) itTuple.next();			
-				lib = jsfLibReg.getJSFLibraryReferencebyID(tuple.id);				
-				if (lib != null) {
-					return new JSFLibraryInternalReference(lib.getLibrary(), 
-							tuple.selected, 
-							tuple.deploy);
-				} /*else {
-					// already logged a message for a missing library
-				}*/
-			}
-		}
-		return null;
-	}
-		
-	private String generatePersistString(List list) {
-		JSFLibraryInternalReference jsfLibItem;
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < list.size(); i++) {
-			jsfLibItem = (JSFLibraryInternalReference)list.get(i);
-			sb = sb.append(jsfLibItem.generatePersistString());
-			sb.append(JSFLibraryConfigProjectData.EO_TUPLE);
-		}
-		return sb.toString();		
-	}	
-	
-	private List getTuples(String strJSFLibs) {
-		List list = new ArrayList();
-		
-		if (strJSFLibs != null) {
-			String patternStr = JSFLibraryConfigProjectData.EO_TUPLE;
-			String[] fields = strJSFLibs.split(patternStr);
-			if (strJSFLibs.length() > 0) {
-				Tuple tuple;
-				for (int i = 0; i < fields.length; i++) {
-					tuple = new Tuple(fields[i]);
-					list.add(tuple);
-				}
-			}			
-		}
-		return list;
-	}
-	
-	/**
-	 * Inner class for parsing project persistent properties. 
-	 * 
-	 * To Do: Take out selected attribute since it is not needed.
-	 *        Add the library name as an attribute.
-	 *        Provide code path to migrate earlier project.
-	 *        
-	 * NOTE: this class should no longer be used except to support
-	 * legacy (pre-2.0M6 library registries)
-	 */
-	static class Tuple {
-		final private String id;
-		final private boolean selected;
-		final private boolean deploy;
-		
-		Tuple(String id, boolean selected, boolean deploy) {
-			this.id = id;
-			this.selected = selected;
-			this.deploy = deploy;
-		}
-		// parse tuple = ID:selected:deploy
-		Tuple(String tuple) {
-			String[] fields = tuple.split(JSFLibraryConfigProjectData.SPTR_TUPLE);
-			
-			if (fields.length >= 3)
-			{
-    			this.id = fields[0];
-    			this.selected = Boolean.valueOf(fields[1]).booleanValue();
-    			this.deploy = Boolean.valueOf(fields[2]).booleanValue();
-			}
-			else
-			{
-			    throw new IllegalStateException("Library registry is corrupt");
-			}
-		}
-		
-		String getID() {
-			return id;
-		}
-		
-		boolean isSelected() {
-			return selected;
-		}
-		
-		boolean needDeploy() {
-			return deploy;
-		}		
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
deleted file mode 100644
index 5575835..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.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:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * Interface for data source to instanciate a <b>JSFLibraryConfigModel</b> object. 
- * 
- * @author Justin Chen - Oracle
- */
-public interface JSFLibraryConfiglModelSource {
- 	/**
-	 * Return a saved JSF implementation library.  
-	 * Depends on the model source, it could be sticky values from DialogSettings or 
-	 * project property values.  
-	 * 
-	 * A null could be returned when creating first web project in a new workspace.
-	 * 
- 	 * @return JSFLibraryInternalReference
- 	 */
- 	public JSFLibraryInternalReference getJSFImplementationLibrary();
- 	
- 	/**
-	 * Return a list of saved JSF component libraries.
-	 * Otheriwse, return an empty list.
-	 *  
- 	 * @return List
- 	 */
- 	public List getJSFComponentLibraries(); 
- 	
- 	/**
-	 * Return type of implementation
-	 *  
- 	 * @return {@link IMPLEMENTATION_TYPE}
- 	 */
- 	public IMPLEMENTATION_TYPE getImplementationType(); 	
-}
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 aca5bf5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java
+++ /dev/null
@@ -1,147 +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
- */
-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() + JSFLibraryConfigProjectData.SPTR_TUPLE + 
-				String.valueOf(isSelected()) + JSFLibraryConfigProjectData.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 131e6d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
+++ /dev/null
@@ -1,604 +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.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-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.core.runtime.QualifiedName;
-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.internal.project.facet.JSFUtils;
-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
- */
-@SuppressWarnings("deprecation")
-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());
-		}
-	}
-	
-	/**
-	 * @param iproject
-	 * @return true if iproject has persistent properties indicating that it may still
-	 * be using V1 JSF Library references
-	 */
-	public static boolean doesProjectHaveV1JSFLibraries(IProject iproject)
-	{
-	   if (iproject == null || !iproject.isAccessible())
-	   {
-	       return false; // won't be able to get reading on a null or closed project
-	   }
-	   
-       try
-        {
-            Object compLib = iproject.getPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-            Object implLib = iproject.getPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-            
-            if (compLib != null || implLib != null)
-            {
-                return true;
-            }
-        }
-        catch(CoreException ce)
-        {
-            JSFCorePlugin.log(ce, "Error checking age of project");
-        }
-        // by default, fall through to false
-        return false;
-	}
-	
-	/**
-	 * Removes the persistent property from JSF projects tagged with
-	 * V1 JSF libraries.
-	 * @param projects
-	 */
-	public static void removeV1JSFLibraryProperty(List<IProject> projects)
-	{
-	    for (final Iterator<IProject> it = projects.iterator(); it.hasNext();)
-	    {
-	        IProject project = it.next();
-            try {
-                if (project.isAccessible())
-                {
-                    project.setPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES), null);
-                    project.setPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES), null);
-                }
-            } catch (CoreException e) {
-                JSFCorePlugin.log(e, "Error removing JSF library persistent property");
-            }
-	    }
-	}
-	
-	/**
-	 * 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 01941ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
+++ /dev/null
@@ -1,221 +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
- */
-public interface ArchiveFile extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 a50d990..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
+++ /dev/null
@@ -1,236 +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
- */
-public interface JSFLibrary extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 73b7057..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
+++ /dev/null
@@ -1,196 +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
- */
-public interface JSFLibraryRegistry extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 77560bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
+++ /dev/null
@@ -1,84 +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
- */
-public interface JSFLibraryRegistryFactory extends EFactory{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 07ba32e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
+++ /dev/null
@@ -1,780 +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
- */
-@SuppressWarnings("hiding")
-public interface JSFLibraryRegistryPackage extends EPackage{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "jsflibraryregistry";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "jsflibreg";
-
-	/**
-	 * 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 ad9f7f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.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;
-
-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
- */
-public final class JSFVersion extends AbstractEnumerator {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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");
-
-	/**
-	 * 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");
-
-	/**
-	 * 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");
-
-	/**
-	 * 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 89722da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.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.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
- */
-public interface PluginProvidedJSFLibrary extends JSFLibrary{
-	/**
-	 * Separator between plugin id and JSF Library name
-	 */
-	public static final String ID_SEPARATOR = "$$";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 f1c76ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
+++ /dev/null
@@ -1,147 +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
- */
-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 6242abe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
+++ /dev/null
@@ -1,705 +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
- */
-public class ArchiveFileImpl extends EObjectImpl implements ArchiveFile {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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());
-			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: ");
-		result.append(relativeToWorkspace);
-		result.append(", SourceLocation: ");
-		result.append(sourceLocation);
-		result.append(", RelativeDestLocation: ");
-		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 2187da7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
+++ /dev/null
@@ -1,557 +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
- */
-public class JSFLibraryImpl extends EObjectImpl implements JSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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: ");
-		result.append(id);
-		result.append(", Name: ");
-		result.append(name);
-		result.append(", JSFVersion: ");
-		result.append(jsfVersion);
-		result.append(", Deployed: ");
-		result.append(deployed);
-		result.append(", Implementation: ");
-		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 0b4846a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.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.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
- */
-public class JSFLibraryRegistryFactoryImpl extends EFactoryImpl implements JSFLibraryRegistryFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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"); 
-			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");
-		}
-	}
-
-	/**
-	 * <!-- 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");
-		}
-	}
-
-	/**
-	 * <!-- 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");
-		}
-	}
-
-	/**
-	 * <!-- 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() + "'");
-		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 6d2964f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
+++ /dev/null
@@ -1,433 +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
- */
-public class JSFLibraryRegistryImpl extends EObjectImpl implements JSFLibraryRegistry {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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: ");
-		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 0532ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
+++ /dev/null
@@ -1,514 +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
- */
-public class JSFLibraryRegistryPackageImpl extends EPackageImpl implements JSFLibraryRegistryPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * <!-- 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);
-		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);
-		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);
-		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);
-
-		EOperation op = addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getJSFLibraryByID", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "ID", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getJSFLibrariesByName", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "name", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getImplJSFLibraries", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getNonImplJSFLibraries", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getAllJSFLibraries", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "addJSFLibrary", 1, 1);
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "removeJSFLibrary", 1, 1);
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getDefaultImplementation", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, null, "setDefaultImplementation");
-		addEParameter(op, this.getJSFLibrary(), "implementation", 1, 1);
-
-		initEClass(jsfLibraryEClass, JSFLibrary.class, "JSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-		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);
-		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);
-		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);
-		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);
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "containsArchiveFile", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "fullPath", 1, 1);
-
-		addEOperation(jsfLibraryEClass, this.getJSFLibrary(), "getWorkingCopy", 1, 1);
-
-		op = addEOperation(jsfLibraryEClass, null, "updateValues");
-		addEParameter(op, this.getJSFLibrary(), "otherLibrary", 1, 1);
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1);
-
-		addEOperation(jsfLibraryEClass, ecorePackage.getEString(), "getLabel", 1, 1);
-
-		initEClass(pluginProvidedJSFLibraryEClass, PluginProvidedJSFLibrary.class, "PluginProvidedJSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-
-		initEClass(archiveFileEClass, ArchiveFile.class, "ArchiveFile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-		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);
-		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);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getName", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getPath", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "exists", 1, 1);
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "equals", 1, 1);
-		addEParameter(op, ecorePackage.getEJavaObject(), "object", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEInt(), "hashCode", 1, 1);
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getResolvedSourceLocation", 1, 1);
-
-		// Initialize enums and add enum literals
-		initEEnum(jsfVersionEEnum, JSFVersion.class, "JSFVersion");
-		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 a7b1e37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
+++ /dev/null
@@ -1,271 +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
- */
-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";
-
-	/**
-	 * 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: ");
-		result.append(pluginID);
-		result.append(", Label: ");
-		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 9972980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
+++ /dev/null
@@ -1,185 +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
- */
-public class JSFLibraryRegistryAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 c865f2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +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
- */
-public class JSFLibraryRegistryResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 1bff4c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.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.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
- */
-public class JSFLibraryRegistryResourceImpl extends XMLResourceImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 b8ccb5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
+++ /dev/null
@@ -1,212 +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
- */
-public class JSFLibraryRegistrySwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * 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 f086212..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.
- */
-public class JSFLibraryRegistryUpgradeUtil {	
-	static String v1Tov2UpgradeURL = "http://www.eclipse.org/JSFxxxxxxxxxxxxxxxxxxxxxx";
-	
-	/**
-	 * 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");
-	}
-	
-	/**
-	 * 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);
-						//TODO: flag failure in status
-						upgradeStatus = 
-							new UpgradeStatus(IStatus.ERROR, true, "Error detected during upgrade!");
-					}
-				}
-				else
-				{
-    				// TODO: what if can't execute?
-                    upgradeStatus = 
-                        new UpgradeStatus(IStatus.ERROR, false, "Error detected during upgrade!");
-				}
-			}
-			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);
-		}
-	}
-
-	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("JSF Registry Upgrade");
-		switch(curVersion)
-		{
-			case 1:
-				op.addVersionUpgrade(
-						new MigrateV1toV2Operation("Upgrade v1 to v2"
-								,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");
-		} finally {
-			if (from != null)
-				try {
-					from.close();
-				} catch (IOException e) {
-		            JSFCorePlugin.log(e, "Error during file close");
-				}
-			if (to != null)
-				try {
-					to.close();
-				} catch (IOException e) {
-                    JSFCorePlugin.log(e, "Error during file close");
-				}
-		}
-
-	}
-
-}
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 5607893..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: JSFLibraryRegistryXMLProcessor.java,v 1.2 2007/04/04 18:50:17 cbateman 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
- */
-public class JSFLibraryRegistryXMLProcessor extends XMLProcessor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-
-	/**
-	 * 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/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 7ea6339..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.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.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;
-
-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());
-				//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);
-				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());
-
-		// delete the new registry 
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v2Registry.toFileString());
-		
-		//and the backup
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString().concat(".bkp"));
-		
-		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 130a358..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
- *
- */
-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, "Upgrade succeeded");
-	}
-
-	/**
-	 * @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, "Upgrade succeeded");
-	}
-
-	/**
-	 * @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 4a75a1d..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
- *
- */
-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(), "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(), "Error committing status", 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(), "Error committing status", 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 bd8f1c2..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
- *
- */
-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");
-	}
-
-	/**
-	 * @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");
-	}
-
-	/**
-	 * @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");
-	}
-
-	/**
-	 * @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");
-	}
-
-	/**
-	 * @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/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 bb3192d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
+++ /dev/null
@@ -1,190 +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 java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-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.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils11;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils12;
-
-/**
- * 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();
-		if (webAppObj != null){
-			//methods below returning the path are identical except for the APIs required
-			if (JSFUtils12.isWebApp25(webAppObj)){
-				return getJavaEEFileURLPath(webAppObj, resource, existingURL);
-			} 
-			else if (JSFUtils11.isWebApp24(webAppObj) || JSFUtils11.isWebApp23(webAppObj)) {
-				return getJ2EEFileURLPath(webAppObj, resource, existingURL);
-			}
-		}
-		return null;			
-	}
-	
-	private IPath getJ2EEFileURLPath(Object webAppObj, IResource resource,
-			IPath existingURL) {
-		WebApp webApp = (WebApp)webAppObj;
-		if (webApp != null){
-			Servlet servlet = JSFUtils11.findJSFServlet(webApp);
-			if (servlet == null)//if no faces servlet, do nothing
-				return null;
-			
-			//if not a JSF page, do nothing
-			if (!isJSFPage(resource))
-				return null;
-			
-			String defaultSuffix = JSFUtils11.getDefaultSuffix(webApp);
-			//is the resource using default_suffix
-			boolean canUseExtensionMapping = resource.getFileExtension().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;
-			
-			Iterator mappings = servlet.getMappings().iterator();
-			ServletMapping map = null;
-			String foundFileExtension = null;
-			String foundPrefixMapping = null;
-			while (mappings.hasNext()){
-				map = (ServletMapping)mappings.next();
-				
-				foundFileExtension = JSFUtils11.getFileExtensionFromMap(map);
-				if (foundFileExtension != null && canUseExtensionMapping) {
-					return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-				}
-				
-				if (foundPrefixMapping == null){
-					foundPrefixMapping = JSFUtils11.getPrefixMapping(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;
-	}
-
-	private IPath getJavaEEFileURLPath(Object webAppObj, IResource resource,
-			IPath existingURL) {
-		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp )webAppObj;
-		if (webApp != null){
-			org.eclipse.jst.javaee.web.Servlet servlet = JSFUtils12.findJSFServlet(webApp);
-			if (servlet == null)//if no faces servlet, do nothing
-				return null;
-			
-			//if not a JSF page, do nothing
-			if (!isJSFPage(resource))
-				return null;
-			
-			String defaultSuffix = JSFUtils12.getDefaultSuffix(webApp);
-			//is the resource using default_suffix
-			boolean canUseExtensionMapping = resource.getFileExtension().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;
-			
-			Iterator mappings = webApp.getServletMappings().iterator();
-			org.eclipse.jst.javaee.web.ServletMapping map = null;
-			String foundFileExtension = null;
-			while (mappings.hasNext()){
-				map = (org.eclipse.jst.javaee.web.ServletMapping)mappings.next();
-				if (map.getServletName().equals(servlet.getServletName())){
-					foundFileExtension = JSFUtils12.getFileExtensionFromMap(map);
-					if (foundFileExtension != null && canUseExtensionMapping) {
-						return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-					}
-						
-					String foundPrefixMapping = JSFUtils12.getPrefixMapping(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;
-	}
-
-	private boolean isValidKnownExtension(String fileExtension) {
-		if ((	fileExtension.equalsIgnoreCase("jsp") ||  //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("jspx") ||  //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("jsf") || //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("xhtml"))) //$NON-NLS-1$
-			return true;
-
-		return false;
-	}
-
-	
-	private boolean isJSFPage(IResource resource) {
-		// currently always return true.
-		// need to find quick way of determining whether this is a JSF JSP Page
-		return true;
-	}
-}
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 86d55d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
+++ /dev/null
@@ -1,84 +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 Libaries from extension points
-JSFLibraryClasspathContainer_IMPL_LIBRARY=[JSF Library - implementation]
-
-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_ValidateJSFImpl=A JSF implementation library has not been chosen
-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_ClientImplValidationMsg=JSF Implementation library must be specified.
-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_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_InternalErr=Internal Error creating JSF Facet.  Missing configuration.
-JSFFacetInstallDelegate_ConfigErr=''{0}'' : unable to configure web module for JavaServer Faces
-JSFFacetInstallDelegate_NonUpdateableWebXML=JSF Facet was not installed on ''{0}''.  The web.xml file needs to be updateable.
-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}
-
-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
-
-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 8667868..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
+++ /dev/null
@@ -1,131 +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 {
-	
-    /**
-     * TODO:
-     */
-	public static final String IMPLEMENTATION_TYPE_PROPERTY_NAME = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME"; //$NON-NLS-1$
-	
-    /**
-     * TODO:
-     */
-    public static final String IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String DEPLOY_IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    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$
-
-    /**
-     * TODO:
-     */
-    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 DEFAULT_IMPLEMENTATION_LIBRARY = "IJSFFacetInstallDataModelProperties.DEFAULT_IMPLEMENTATION_LIBRARY"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String IMPLEMENTATION_LIBRARIES = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String COMPONENT_LIBRARIES = "IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES"; //$NON-NLS-1$	 
-    
-    /**
-     * Enumeration of implementation types
-     */
-    public enum IMPLEMENTATION_TYPE {
-    	
-    	/**
-    	 * Unknown
-    	 */
-    	UNKNOWN,
-    	/**
-    	 * Server supplied
-    	 */
-    	SERVER_SUPPLIED,
-    	/**
-    	 * Not supplied by the server.  The user is specifiying.
-    	 */
-    	USER_SPECIFIED,
-    	
-    	/**
-    	 * Not supplied by the server.  The user is specifiying.  Same as USER_SPECIFIED.
-    	 * @deprecated use USER_SPECIFIED
-    	 */
-    	CLIENT_SUPPLIED;
-    	
-    	/**
-    	 * @param type
-    	 * @return String value
-    	 */
-    	public static String getStringValue(final IMPLEMENTATION_TYPE type){
-    		if (type == null)
-    			return "UNKNOWN"; //$NON-NLS-1$
-    		if (type ==  SERVER_SUPPLIED)
-    			return "SERVER_SUPPLIED";//$NON-NLS-1$
-    		if (type == USER_SPECIFIED || type ==CLIENT_SUPPLIED )
-    			return "USER_SPECIFIED";//$NON-NLS-1$
-    		return "UNKNOWN"; //$NON-NLS-1$
-    	}
-    	
-    	/**
-    	 * @param type
-    	 * @return IMPLEMENTATION_TYPE
-    	 */
-    	public static IMPLEMENTATION_TYPE getValue(final String type){
-    		if (type == null)
-    			return UNKNOWN;
-    		if (type.equals("SERVER_SUPPLIED"))//$NON-NLS-1$
-    			return SERVER_SUPPLIED;
-    		if (type.equals("USER_SPECIFIED") || type.equals("CLIENT_SUPPLIED"))//$NON-NLS-1$// $NON-NLS-2$
-    			return USER_SPECIFIED;
-    		return UNKNOWN; 
-    	}
-    	
-    }
-}
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 de9ae3e..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.JavaFacetUtils;
-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( JavaFacetUtils.JAVA_13 );
-            }
-            else if( webFacetVersion == WebFacetUtils.WEB_24 )
-            {
-                facets.add( JavaFacetUtils.JAVA_14 );
-            }
-            else
-            {
-                facets.add( JavaFacetUtils.JAVA_50 );
-            }
-            
-            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/JSFFacetDefaultVersionProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetDefaultVersionProvider.java
deleted file mode 100644
index 549f050..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetDefaultVersionProvider.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.core.internal.project.facet;
-
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-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 JSF project facet version.
- * Currently always returns "1.1" facet version.   Eventually should be computed from the project's facet context.
- */
-public final class JSFFacetDefaultVersionProvider implements IDefaultVersionProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDefaultVersionProvider#getDefaultVersion()
-	 */
-	public IProjectFacetVersion getDefaultVersion() {		
-		return ProjectFacetsManager.getProjectFacet(IJSFCoreConstants.JSF_CORE_FACET_ID).getVersion(IJSFCoreConstants.FACET_VERSION_1_1);
-	}
-
-}
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 3227c38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,373 +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.util.ArrayList;
-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.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.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.jsflibraryconfig.JSFLibraryRegistryUtil;
-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.IFacetedProject.Action;
-
-/**
- * Provides a data model used by the JSF facet install.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallDataModelProvider extends
-		FacetInstallDataModelProvider implements
-		IJSFFacetInstallDataModelProperties {
-
-	private String 	errorMessage;
-	
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(IMPLEMENTATION_TYPE_PROPERTY_NAME);
-		names.add(IMPLEMENTATION);
-		names.add(DEPLOY_IMPLEMENTATION);
-		names.add(CONFIG_PATH);
-		names.add(SERVLET_NAME);
-		names.add(SERVLET_CLASSNAME);
-		names.add(SERVLET_URL_PATTERNS);
-		names.add(WEBCONTENT_DIR);
-		
-		names.add(IMPLEMENTATION_LIBRARIES);
-		names.add(COMPONENT_LIBRARIES);
-		names.add(DEFAULT_IMPLEMENTATION_LIBRARY);
-		
-		return names;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)){
-			return IMPLEMENTATION_TYPE.UNKNOWN;
-		}
-		else if (propertyName.equals(IMPLEMENTATION)) {
-			if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() == null)
-				return null;
-			return getDefaultImplementationLibrary();//JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation();
-		} else if (propertyName.equals(DEPLOY_IMPLEMENTATION)) {
-			return Boolean.TRUE;
-		} else 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(COMPONENT_LIBRARIES)) {
-			return new JSFLibraryInternalReference[0];
-		} else if (propertyName.equals(IMPLEMENTATION_LIBRARIES)) {
-			return getDefaultJSFImplementationLibraries();
-		} else if (propertyName.equals(DEFAULT_IMPLEMENTATION_LIBRARY)) {
-			return getDefaultImplementationLibrary();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	public IStatus validate(String name) {
-		errorMessage = null;
-		if (name.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)) {
-			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.UNKNOWN) {
-				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE);
-			}
-		}
-		else if (name.equals(IMPLEMENTATION)) {
-			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.USER_SPECIFIED) {
-				JSFLibraryInternalReference lib = (JSFLibraryInternalReference)getProperty(IMPLEMENTATION);
-				IStatus status = validateImpl(lib.getLibrary());
-				if (!OK_STATUS.equals(status))
-					return status;
-					
-	            return validateClasspath();
-			}
-		} else 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();
-		}
-		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 validateImpl(JSFLibrary impl) {
-		if (impl == null) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateJSFImpl; 
-		}
-		if (errorMessage != null) {
-			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);
-		}
-		
-		if (text.lastIndexOf("\\") >= 0){ //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-			return createErrorStatus(errorMessage);
-		} 
-
-		if (passedPath.getDevice() != null) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-		IPath webContentFolder = getWebContentFolder();
-		IPath setPath = webContentFolder.append(passedPath);
-		if (!getWebContentFolder().isPrefixOf(setPath)) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-
-		return OK_STATUS;
-	}
-	
-	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 ref = null;
-		if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.USER_SPECIFIED) {
-			ref = ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION));
-			if (ref != null){
-				status = checkForDupeArchiveFiles(jars, ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION)).getLibrary());
-				if (!OK_STATUS.equals(status)){
-					return status;
-				}
-			} else {
-				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_ClientImplValidationMsg);
-			}
-		}
-
-		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))
-			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")){
-				IDataModel webFacet = (IDataModel) action.getConfig();
-				return webFacet.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER );
-			}
-		}
-		
-		//should not get here.   
-		return null;
-	}
-
-	private List getDefaultJSFImplementationLibraries() {
-		List list = new ArrayList();
-		if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() != null) {
-			JSFLibrary jsfLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation();
-			if (jsfLib != null){
-				JSFLibraryInternalReference prjJSFLib = new JSFLibraryInternalReference(jsfLib, true, true);
-				list.add(prjJSFLib);
-			}
-		}
-		return list;
-	}	
-	
-	private JSFLibraryInternalReference getDefaultImplementationLibrary() {		
-		if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() != null) {
-			JSFLibrary jsfLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation();
-			return new JSFLibraryInternalReference(jsfLib, true, true);	
-		}
-		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 b96e96f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
+++ /dev/null
@@ -1,366 +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.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathAttribute;
-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.ClasspathHelper;
-import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil;
-import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
-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.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.WebApp;
-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.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-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 {
-
-	/* (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);
-			}
-
-			//Before we do any configuration, verify that web.xml is available for update
-			IModelProvider provider = JSFUtils.getModelProvider(project);
-			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())); //$NON-NLS-2$
-				}
-			}
-			
-			// Create JSF Libs as classpath containers and set WTP dependencies
-			// as required
-			createClasspathEntries(project, fv, config, monitor);
-
-			// Create config file
-			createConfigFile(project, fv, config, monitor);
-
-			// Update web model
-			createServletAndModifyWebXML(project, config, monitor);
-
-			if (monitor != null) {
-				monitor.worked(1);
-			}
-
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * Adds the JSF Library references specified in the wizard to the project as
-	 * classpath containers. Marks the containers as J2EE module dependencies as
-	 * required
-	 * 
-	 * @param project
-	 * @param config
-	 * @param monitor
-	 */
-	private void createClasspathEntries(final IProject project, final IProjectFacetVersion fv, final IDataModel config, final IProgressMonitor monitor) {
-		IJavaProject javaProject = JavaCore.create(project);	
-		List cpEntries = new ArrayList();
-		try {
-			for (int i=0;i<javaProject.getRawClasspath().length;i++){
-				cpEntries.add(javaProject.getRawClasspath()[i]);
-			}
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Unable to read classpath"); //$NON-NLS-1$
-		}
-		
-		IPath path, cp = null;
-		IClasspathEntry entry = null;
-		JSFLibraryInternalReference libref = null;
-		
-		//Implementation
-		if (config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME) 
-				== IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.USER_SPECIFIED){
-			cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
-			libref = (JSFLibraryInternalReference)config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
-			path = cp.append(new Path(libref.getID()));
-			entry = getNewCPEntry(path, libref);		
-			cpEntries.add(entry);
-		} 
-
-		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[])config.getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
-		for (int i=0;i<compLibs.length;i++){
-			libref = compLibs[i];		
-			cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
-			path = cp.append(new Path(libref.getID()));
-			entry = getNewCPEntry(path, libref);
-			if (entry != null)
-				cpEntries.add(entry);
-		}	
-
-		JSFLibraryRegistryUtil.setRawClasspath(javaProject, cpEntries, monitor);
-	
-		//allow for the raw classpath to be set from JSF Libs before setting the server supplied impl libs from the server, if available
-		if (config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME) 
-				== IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
-			try {
-				ClasspathHelper.removeClasspathEntries(project, fv);
-				ClasspathHelper.addClasspathEntries(project, fv);
-			} catch (CoreException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Unable to add server supplied implementation to the classpath.", e);//$NON-NLS-1$
-			}
-		}
-		
-	}
-
-	/**
-	 * @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 config
-	 * @return list of URL patterns from the datamodel
-	 */
-	private List getServletMappings(final IDataModel config) {
-		List mappings = new ArrayList();
-		String[] patterns = (String[])config.getProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		for (int i = 0; i < patterns.length; i++) {
-			String pattern = patterns[i];
-			mappings.add(pattern);
-		}
-
-		return mappings;
-	}
-
-	/**
-	 * @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 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(IProgressMonitor monitor_inner) throws CoreException{ 
-						if (shouldUseJ2EEConfig(fv)){
-							JSFUtils11.createConfigFile(fv.getVersionString(),
-									configPath);
-						} else {
-							JSFUtils12.createConfigFile(fv.getVersionString(),
-									configPath);
-						}
-						project.refreshLocal(IResource.DEPTH_INFINITE, monitor_inner);
-					}
-
-					private boolean shouldUseJ2EEConfig(final IProjectFacetVersion facetVersion) {
-						if (IJSFCoreConstants.FACET_VERSION_1_1.equals(facetVersion.getVersionString()))
-						{
-							return true;
-						}
-						return false;
-					}
-				};
-				op.run(monitor);
-			}
-		} catch (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) {
-		
-		IModelProvider provider = JSFUtils.getModelProvider(project);
-		IPath webXMLPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (JSFUtils12.isWebApp25(provider.getModelObject())) {			
-			provider.modify(new UpdateWebXMLForJavaEE(project, config), doesDDFileExist(project, webXMLPath) ? webXMLPath : IModelProvider.FORCESAVE); 
-		}
-		else {//must be 2.3 or 2.4			
-			provider.modify(new UpdateWebXMLForJ2EE(project, config), webXMLPath);
-		}
-
-	}
-
-	private boolean doesDDFileExist(IProject project, IPath webXMLPath) {
-		return project.getProjectRelativePath().append(webXMLPath).toFile().exists();		
-	}
-
-	private class UpdateWebXMLForJavaEE implements Runnable {
-		private IProject project;
-		private IDataModel config;
-		
-		UpdateWebXMLForJavaEE(final IProject project, final IDataModel config){
-			this.project = project;
-			this.config = config;
-		}
-		
-		public void run() {
-			WebApp webApp = (WebApp) ModelProviderManager.getModelProvider(project).getModelObject();
-			// create or update servlet ref
-			Servlet servlet = JSFUtils12.findJSFServlet(webApp);// check to see
-																// if already
-// No longer removing any old mappings on install - see 194919 															// present
-//			if (servlet != null) {
-//				// remove old mappings
-//				JSFUtils12.removeURLMappings(webApp, servlet);
-//			}
-			
-			servlet = JSFUtils12
-					.createOrUpdateServletRef(webApp, config, servlet);
-	
-			// init mappings
-			List listOfMappings = getServletMappings(config);
-			JSFUtils12.setUpURLMappings(webApp, listOfMappings, servlet);
-	
-			// setup context params
-			JSFUtils12.setupConfigFileContextParamForV2_5(webApp, config);
-		}
-	}
-	
-	private class UpdateWebXMLForJ2EE implements Runnable {		
-		private IProject project;
-		private IDataModel config;
-		
-		UpdateWebXMLForJ2EE(IProject project, final IDataModel config){
-			this.project = project ;
-			this.config = config;
-		}
-		
-		public void run() {
-			org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp)ModelProviderManager.getModelProvider(project).getModelObject();
-			// create or update servlet ref
-			org.eclipse.jst.j2ee.webapplication.Servlet servlet = JSFUtils11.findJSFServlet(webApp);// check to see
-																// if already
-																// present
-			
-// No longer removing any old mappings on install - see 194919 
-//			if (servlet != null) {
-//				// remove old mappings
-//				JSFUtils11.removeURLMappings(webApp, servlet);
-//			}
-			
-			servlet = JSFUtils11
-					.createOrUpdateServletRef(webApp, config, servlet);
-	
-			// init mappings
-			List listOfMappings = getServletMappings(config);
-			JSFUtils11.setUpURLMappings(webApp, listOfMappings, servlet);
-	
-			// setup context params
-			setupContextParams(webApp, config);
-		}
-		
-		private void setupContextParams(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final IDataModel config) {
-			if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID)//shouldn't have to do it this way, but that's the way it goes 119442
-				JSFUtils11.setupConfigFileContextParamForV2_3(webApp, config);
-			else 
-				JSFUtils11.setupConfigFileContextParamForV2_4(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 e855551..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.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.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
- */
-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/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 892f8f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
+++ /dev/null
@@ -1,235 +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 java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.IStatus;
-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.core.JavaModelException;
-import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.javaee.core.ParamValue;
-import org.eclipse.jst.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-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 {
-	
-	/* (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 {
-				//Before we do any de-configuration, verify that web.xml is available for update
-				IModelProvider provider = JSFUtils.getModelProvider(project);
-				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
-				removeJSFLibraries(project, fv, monitor);
-				
-				//Remove Runtime contributed JSF classpath entries
-				removeRuntimeContributedJSFClasspathEntries(project, fv, monitor);
-				
-				// remove servlet stuff from web.xml
-				uninstallJSFReferencesFromWebApp(project, monitor);
-
-				if (monitor != null) {
-					monitor.worked(1);
-				}
-				
-			} finally {
-				if (monitor != null) {
-					monitor.done();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes JSF Lib CP Containers from project
-	 * @param project
-	 * @param monitor
-	 */
-	private void removeJSFLibraries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
-		 final IJavaProject jproj = JavaCore.create(project);
-		 List keptEntries = new ArrayList();
-		 try {
-			IClasspathEntry[] entries = jproj.getRawClasspath();
-			  keptEntries = new ArrayList();
-			 for (int i=0;i<entries.length;i++){
-				 IClasspathEntry entry = entries[i];
-				 if ( !(JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)))
-					 keptEntries.add(entry);
-			 }
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Cannot get classpath entries to remove JSF Libraries for: "+project.getName()); //$NON-NLS-1$
-		}
-		 
-		 if (keptEntries.size() > 0){
-			 try {
-				jproj.setRawClasspath((IClasspathEntry[])keptEntries.toArray(new IClasspathEntry[0]), monitor);
-			} catch (JavaModelException e) {
-				JSFCorePlugin.log(e, "Exception occured while removing JSF Libraries during JSF Facet uninstall"); //$NON-NLS-1$
-			}
-		 }	
-		
-
-	}
-	
-	private void removeRuntimeContributedJSFClasspathEntries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
-		try {
-			ClasspathHelper.removeClasspathEntries(project, fv);				
-		} catch (CoreException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "Unable to remove server supplied implementation from the classpath.", e);//$NON-NLS-1$
-		}
-	}
-	
-	private void uninstallJSFReferencesFromWebApp(final IProject project,
-			final IProgressMonitor monitor) {
-		
-		IModelProvider provider = JSFUtils.getModelProvider(project);
-		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)){		
-				WebApp webApp = (WebApp)webAppObj;
-				Servlet servlet = JSFUtils12.findJSFServlet(webApp);
-				if (servlet == null)
-					return;
-
-				provider.modify(new RemoveJSFFromJavaEEWebAppOperation(project), ddPath);
-			} else {//2.3 or 2.4 web app
-				org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp)webAppObj;
-				org.eclipse.jst.j2ee.webapplication.Servlet servlet = JSFUtils11.findJSFServlet(webApp);
-				if (servlet == null)
-					return;
-
-				provider.modify(new RemoveJSFFromJ2EEWebAppOperation(project), ddPath);			
-			}
-		}
-	}
-
-	private boolean isJavaEEWebApp(final Object webAppObj) {
-		if (webAppObj instanceof WebApp) 
-			return true;
-
-		return false;
-		
-	}
-
-	static class RemoveJSFFromJavaEEWebAppOperation implements Runnable {
-		private IProject _project;
-		
-		RemoveJSFFromJavaEEWebAppOperation(final IProject project){
-			this._project = project;			
-		}
-		
-		public void run() {
-			WebApp webApp = (WebApp) ModelProviderManager.getModelProvider(_project).getModelObject();
-			Servlet servlet = JSFUtils12.findJSFServlet(webApp);
-			
-			// remove faces url mappings
-			JSFUtils12.removeURLMappings(webApp, servlet);
-			// remove context params
-			removeJSFContextParams(webApp, servlet);
-			// remove servlet
-			removeJSFServlet(webApp, servlet);
-			
-		}
-		private void removeJSFContextParams(final WebApp webApp, final Servlet servlet) {
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				ParamValue cp = (ParamValue) it.next();
-				if (cp.getParamName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContextParams().remove(cp);
-					break;
-				}
-			}
-		}
-
-		private void removeJSFServlet(final WebApp webApp, final Servlet servlet) {		
-			webApp.getServlets().remove(servlet);
-		}
-		
-	}
-	
-	static class RemoveJSFFromJ2EEWebAppOperation implements Runnable {
-		private IProject _project;		
-		
-		RemoveJSFFromJ2EEWebAppOperation(final IProject project){
-			this._project = project;
-		}
-		
-		public void run() {
-			org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager.getModelProvider(_project).getModelObject();
-			org.eclipse.jst.j2ee.webapplication.Servlet servlet = JSFUtils11.findJSFServlet(webApp);
-
-			// remove faces url mappings
-			JSFUtils11.removeURLMappings(webApp, servlet);
-			// remove context params
-			removeJSFContextParams(webApp, servlet);
-			// remove servlet
-			removeJSFServlet(webApp, servlet);
-			
-		}
-		private void removeJSFContextParams(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet) {
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				org.eclipse.jst.j2ee.common.ParamValue cp = (org.eclipse.jst.j2ee.common.ParamValue) it.next();
-				if (cp.getName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContextParams().remove(cp);
-					break;
-				}
-			}
-		}
-
-		private void removeJSFServlet(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet) {
-			webApp.getServlets().remove(servlet);
-		}
-		
-	}
-
-}
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 88e8d61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
+++ /dev/null
@@ -1,327 +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.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-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.j2ee.model.ModelProviderManager;
-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;
-
-
-/**
- * 
- */
-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
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_LIBRARIES = "jsf.implementation.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for component libraries in persistent properties
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_COMPONENT_LIBRARIES = "jsf.component.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for implementation type in persistent properties
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_TYPE = "jsf.implementation.type"; //$NON-NLS-1$
-	/**
-	 * 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 static 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;		
-	}
-	
-	/**
-	 * 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 static 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 static 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 static void logErroronMissingJAR(JSFLibrary jsfLib, ArchiveFile ar) {
-		String msg = NLS.bind(Messages.JSFUtils_MissingJAR, 
-						ar.getName(),
-						jsfLib.getLabel());
-		JSFCorePlugin.log(IStatus.ERROR, msg);
-	}
-	
-
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected static String getDisplayName(IDataModel config) {
-		String displayName = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		if (displayName == null || displayName.trim().equals("")) //$NON-NLS-1$
-			displayName = JSF_DEFAULT_SERVLET_NAME;
-		return displayName.trim();
-	}
-	
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected static 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();
-	}
-	
-	/**
-	 * Servlet 2.3_SRV.11.2: a string that begins with a "/" and ends
-	 * with "/*" is a prefix mapping
-	 * 
-	 * @param mapping
-	 * @return true if the mapping string represents a prefix mapping
-	 */
-	public static boolean isPrefixMapping(final String mapping)
-	{
-	    if (mapping == null || mapping.length() < 4)
-	    {
-	        return false;
-	    }
-	    
-	    return mapping.charAt(0) == '/' && mapping.endsWith("/*");
-	}
-	
-	/**
-	 * Servlet 2.3_SRV.11.2: a string that begins with "*." 
-	 * is an extension mapping
-     * 
-	 * @param mapping
-	 * @return true if mapping is an extension mapping
-	 */
-	public static boolean isExtensionMapping(final String mapping)
-	{
-	    if (mapping == null)
-	    {
-	        return false;
-	    }
-	    
-	    return mapping.startsWith("*.");
-	}	
-
-	/**
-	 * @param webProject
-	 * @return IModelProvider
-	 */
-	public static IModelProvider getModelProvider(IProject webProject) {
-		IModelProvider provider = ModelProviderManager.getModelProvider(webProject); 
-		Object webAppObj = provider.getModelObject();
-		if (webAppObj == null){			
-			return null;
-		}			
-		return provider;
-	}
-	
-	/**
-	 * Search the list of servlet-mappings for the first extension and prefix mappings.  The contents
-	 * of mappings is assumed to be all url-pattern's.  
-	 * 
-	 * If prefExtMapping is not null, it is an extension mapping and
-     * it is in mappings, then it is returned.  Otherwise, the first extension
-     * mapping in mappings is returned.  Returns null if mappings does not
-     * contain an extension mapping.  The same algorithm holds for prefPrefixMapping and
-     * corresponding prefix mapping.
-     * 
-     * See isExtensionMapping and isPrefixMapping for more information on url patterns.
-	 * 
-	 * @param mappings
-	 * @param prefExtMapping
-	 * @param prefPrefixMapping
-	 * @return the result
-	 */
-	public static MappingSearchResult searchServletMappings(
-			final List<String> mappings, String prefExtMapping,
-			String prefPrefixMapping) {
-		String firstExtFound = null;
-		String firstPrefixFound = null;
-		boolean foundExtMapping = false;
-		boolean foundPrefixMapping = false;
-
-		// if the caller has no preferredMapping, then
-		// set it to something guaranteed to be non-null
-		// and which is guaranteed not to match anything
-		// that pass isExtensionMapping
-		if (prefExtMapping == null) {
-			prefExtMapping = "NOTANEXTENSIONMAPPING";
-		}
-
-		// similarly, guarantee that if the caller has no
-		// preferred prefix mapping, that we set a non-null
-		// comp mapping
-		if (prefPrefixMapping == null) {
-			prefPrefixMapping = "NOTAPREFIXMAPPING";
-		}
-
-		SEARCH_LOOP: for (String mapping : mappings) {
-			if (isExtensionMapping(mapping)) {
-				// can assum that mapping is non-null since
-				// it is an ext mapping
-				if (prefExtMapping.equals(mapping.trim())) {
-					firstExtFound = prefExtMapping;
-					continue;
-				}
-
-				if (firstExtFound == null) {
-					firstExtFound = mapping.trim();
-				}
-			} else if (isPrefixMapping(mapping)) {
-				if (prefPrefixMapping.equals(mapping.trim())) {
-					firstPrefixFound = prefPrefixMapping;
-					continue;
-				}
-
-				if (firstPrefixFound == null) {
-					firstPrefixFound = mapping.trim();
-				}
-			}
-
-			if (foundExtMapping && foundPrefixMapping) {
-				break SEARCH_LOOP;
-			}
-		}
-
-		return new MappingSearchResult(firstExtFound, firstPrefixFound);
-	}
-	
-    /**
-	 * The result of a servlet mapping search
-	 * 
-	 */
-	public static class MappingSearchResult {
-		private final String _extensionMapping; // may be null;
-		private final String _prefixMapping; // may be null
-
-		MappingSearchResult(final String extensionMapping,
-				final String prefixMapping) {
-			_extensionMapping = extensionMapping;
-			_prefixMapping = prefixMapping;
-		}
-
-		/**
-		 * @return true if the search yielded a valid result
-		 */
-		public boolean isResult() {
-			return _extensionMapping != null || _prefixMapping != null;
-		}
-
-		/**
-		 * @return the first extension mapping matching search criteria or null
-		 * if none
-		 */
-		public final String getExtensionMapping() {
-			return _extensionMapping;
-		}
-
-		/**
-		 * @return the first prefix mapping matching search criteria or null
-		 * if none
-		 */
-		public final String getPrefixMapping() {
-			return _prefixMapping;
-		}
-    }
-}
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 8fa212f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
+++ /dev/null
@@ -1,464 +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.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-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.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.JSPType;
-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;
-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.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF model v1.1
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFUtils11 extends JSFUtils {	
-	
-	/**
-	 * Convenience method for getting writeable WebApp model
-	 * @param project
-	 * @return WebArtifactEdit
-	 * @deprecated - must use IModelProviders
-	 */
-	public static WebArtifactEdit getWebArtifactEditForWrite(final IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForWrite(project);
-	}
-
-	/**
-	 * Convenience method for getting read-only WebApp model
-	 * @param project
-	 * @return WebArtifactEdit
-	 * @deprecated - must use IModelProviders
-	 */
-	public static WebArtifactEdit getWebArtifactEditForRead(final IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForRead(project);
-	}
-
-	/**
-	 * @param webApp as Object
-	 * @return Servlet - the JSF Servlet for the specified WebApp or null if not present
-	 */
-	public static Servlet findJSFServlet(final Object webApp) {
-		Iterator it = null;
-		if (webApp == null)
-			return null;
-		else if (webApp instanceof WebApp)
-			it = ((WebApp)webApp).getServlets().iterator();
-		else if (webApp instanceof org.eclipse.jst.javaee.web.WebApp)
-			it = ((org.eclipse.jst.javaee.web.WebApp)webApp).getServlets().iterator();
-		else
-			return null;
-		
-		while (it.hasNext()) {
-            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(
-							JSF_SERVLET_CLASS)) {
-						return servlet;
-					}
-				} else if (servlet.getWebType().isJspType()) {
-					if (((JSPType) servlet.getWebType()).getJspFile() != null && 
-							((JSPType) servlet.getWebType()).getJspFile().trim().equals(
-							JSF_SERVLET_CLASS)) {
-						return servlet;
-					}
-				}
-			}
-		}
-        
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-		return null;
-	}
-
-	/**
-	 * Creates a stubbed JSF configuration file for specified JSF version and path
-	 * @param jsfVersion
-	 * @param configPath
-	 */
-	public static void createConfigFile(final String jsfVersion, final IPath configPath) {
-		FileOutputStream os = null;
-		PrintWriter pw = 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);
-			pw = new PrintWriter(os);
-			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$
-
-			if (jsfVersion.equals(IJSFCoreConstants.FACET_VERSION_1_1)) 
-            { 
-				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$
-			} 
-
-			pw.close();
-			pw = null;
-		} catch (FileNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} catch (IOException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} finally {
-			if (pw != null)
-				pw.close();
-			if (os != null) {
-				try {
-					os.close();
-				} catch (IOException e) {
-					JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	public static Servlet createOrUpdateServletRef(final WebApp webApp,
-			final IDataModel config, Servlet servlet) {
-		
-		String displayName 	= getDisplayName(config);
-		String className 	= getServletClassname(config);
-		
-		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, servlet.getServletName().trim(), displayName);
-			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(Integer.valueOf(1));
-		}
-		return servlet;
-	}
-
-	private static void updateServletMappings(final WebApp webApp, final Servlet servlet,
-			final String servletName, final String newServletName) {
-		List<ServletMapping> mappings = findServletMappings(webApp, servlet, servletName);
-		for (ServletMapping map : mappings){
-			map.setName(newServletName);
-		}
-		
-	}
-
-	
-	private static List<ServletMapping> findServletMappings(final WebApp webApp, final Servlet servlet, final String servletName) {			
-		List<ServletMapping> mappings = new ArrayList<ServletMapping>();
-		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;		
-	}
-
-	/**
-	 * @param webApp as Object
-	 * @return true if webApp instanceof org.eclipse.jst.javaee.web.WebApp
-	 */
-	public static boolean isWebApp25(final Object webApp) {
-		if (webApp instanceof org.eclipse.jst.javaee.web.WebApp)
-			return true;
-		return false;
-	}
-
-	/**
-	 * 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);
-			}
-		}
-	}
-	
-
-	private static boolean doesServletMappingExist(final WebApp webApp, final Servlet servlet,
-			final String pattern) {	
-		
-		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) &&
-						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);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates or updates config file context-param in v 2.3 WebApp if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_3(final WebApp webApp,
-			final IDataModel config) {
-		// if not default name and location, then add context param
-		ContextParam cp = null;
-		ContextParam foundCP = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// 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(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				cp = WebapplicationFactory.eINSTANCE.createContextParam();
-				cp.setParamName(JSF_CONFIG_CONTEXT_PARAM);
-				cp.setParamValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContexts().add(cp);
-			} else {
-				cp = foundCP;
-				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getParamValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setParamValue(val);
-				}
-			}
-		}
-	}
-	/**
-	 * Creates or updates config file context-param in v2.4 WebApp  if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_4(final WebApp webApp,
-			final IDataModel config) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// 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(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				ParamValue pv = CommonFactory.eINSTANCE.createParamValue();
-				pv.setName(JSF_CONFIG_CONTEXT_PARAM);
-				pv.setValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContextParams().add(pv);
-			} else {
-				cp = foundCP;
-				if (cp.getValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setValue(val);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.j2ee.web.WebApp and versionID == 24
-	 */
-	public static boolean isWebApp24(final Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersionID() == 24)
-			return true;
-		return false;
-	}
-	
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.j2ee.web.WebApp and versionID == 23
-	 */
-	public static boolean isWebApp23(final Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersionID() == 23)
-			return true;
-		return false;
-	}
-	
-	/**
-	 * @param webApp
-	 * @return the default file extension from the context param.  Default is "jsp" if no context param.
-	 */
-	public static String getDefaultSuffix(final WebApp webApp) {
-		String defaultSuffix = "jsp"; //$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(JSF_DEFAULT_SUFFIX_CONTEXT_PARAM)){				
-				String defSuffix = cp.getParamValue();
-				if (defSuffix.startsWith(".")) //$NON-NLS-1$
-					defSuffix = defSuffix.substring(1);
-								
-				return defSuffix;
-			}
-		}
-		return defaultSuffix;
-	}
-	
-	/**
-	 * @param map
-	 * @return prefix mapping.  may return null.
-	 */
-	public static String getPrefixMapping(final ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		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;
-	}
-	
-	/**
-	 * @param map
-	 * @return extension from map.  Will return null if file extension not found in url patterns.
-	 */
-	public static String getFileExtensionFromMap(final ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		if (extPath != null){
-			String ext = extPath.getFileExtension();
-			if (ext != null && !ext.equals("")) //$NON-NLS-1$
-				return ext;
-		}
-		return null;
-	}
-
-}
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 71a2b2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
+++ /dev/null
@@ -1,354 +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.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-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.WebAppVersionType;
-import org.eclipse.jst.javaee.web.WebFactory;
-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.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF v1.2 model
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFUtils12 extends JSFUtils {
-
-	/**
-	 * @param webApp
-	 * @return Servlet - the JSF Servlet for the specified WebApp or null if not present
-	 */
-	public static Servlet findJSFServlet(final WebApp webApp) {
-
-		Iterator it = webApp.getServlets().iterator();
-		
-		while (it.hasNext()) {
-            Servlet servlet = (Servlet) it.next();
-			if (servlet.getServletClass() != null &&
-					servlet.getServletClass().trim().equals (JSF_SERVLET_CLASS)) {
-				return servlet;
-			}
-		}
-        
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-		return null;
-	}
-
-	/**
-	 * Creates a stubbed JSF v1.2 configuration file for specified JSF version and path
-	 * @param jsfVersion
-	 * @param configPath
-	 */
-	public static void createConfigFile(final String jsfVersion, final IPath configPath) {
-		FileOutputStream os = null;
-		PrintWriter pw = 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);
-			pw = new PrintWriter(os);
-			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$
-
-			if (jsfVersion.equals(IJSFCoreConstants.FACET_VERSION_1_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
-								+ "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" //$NON-NLS-1$
-								+ QUOTE + "\n"); //$NON-NLS-1$
-				pw.write("    " + "version=" + QUOTE + "1.2" + QUOTE + ">\n\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				pw.write("</faces-config>\n"); //$NON-NLS-1$
-			}
-
-			pw.close();
-			pw = null;
-		} catch (FileNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} catch (IOException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} finally {
-			if (pw != null)
-				pw.close();
-			if (os != null) {
-				try {
-					os.close();
-				} catch (IOException e) {
-					JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-				}
-			}
-		}
-	}
-
-
-	/**
-	 * 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
-	 */
-	public static Servlet createOrUpdateServletRef(final WebApp webApp,
-			final IDataModel config, org.eclipse.jst.javaee.web.Servlet servlet) {
-		
-		String displayName = getDisplayName(config);		
-		String className = getServletClassname(config);
-		
-		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;
-	}
-
-	private 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);
-		}
-		
-	}
-
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.javaee.web.WebApp and WebAppVersionType._25
-	 */
-	public static boolean isWebApp25(final Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersion() == WebAppVersionType._25_LITERAL) 
-			return true;
-		return false;
-	}
-	
-	/**
-	 * 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 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
-			Iterator it = urlMappingList.iterator();
-			while (it.hasNext()) {
-				String pattern = (String) it.next();
-				if (!(doesServletMappingPatternExist(webApp, mapping, pattern))){
-					UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
-					urlPattern.setValue(pattern);				
-					mapping.getUrlPatterns().add(urlPattern);
-				}
-			}
-		}
-	}
-	
-	private 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;
-	}
-
-	private static boolean doesServletMappingPatternExist(final WebApp webApp, final ServletMapping mapping,
-			final String pattern) {	
-		for (Iterator it=mapping.getUrlPatterns().iterator();it.hasNext();){
-			String patternTypeValue = ((UrlPatternType)it.next()).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);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Creates or updates config file context-param in v2.5 WebApp if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_5(final org.eclipse.jst.javaee.web.WebApp webApp,
-			final IDataModel config) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// 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(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				ParamValue pv = JavaeeFactory.eINSTANCE.createParamValue();
-				pv.setParamName(JSF_CONFIG_CONTEXT_PARAM);
-				pv.setParamValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContextParams().add(pv);
-			} else {
-				cp = foundCP;
-				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getParamValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setParamValue(val);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param webApp
-	 * @return the default file extension from the context param.  Default is "jsp" if no context param
-	 */
-	public static String getDefaultSuffix(final WebApp webApp) {
-		String defaultSuffix = "jsp"; //$NON-NLS-1$
-		for (Iterator it = webApp.getContextParams().iterator();it.hasNext();) {		
-			ParamValue cp = (ParamValue) it.next();		
-			if (cp != null && 
-					cp.getParamName() != null && 
-					cp.getParamName().trim().equals(JSF_DEFAULT_SUFFIX_CONTEXT_PARAM)){				
-				String defSuffix = cp.getParamValue();
-				if (defSuffix.startsWith(".")) //$NON-NLS-1$
-					defSuffix = defSuffix.substring(1);
-								
-				return defSuffix;
-			}
-		}
-		return defaultSuffix;
-	}
-	
-	/**
-	 * @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;
-	}
-	
-	/**
-	 * @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;
-	}
-}
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 b1c62db..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"
-                , _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 21b4487..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2ElementAdapter.java
+++ /dev/null
@@ -1,249 +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 java.util.concurrent.atomic.AtomicBoolean;
-
-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 AtomicBoolean         _isInitialized =
-                                                new AtomicBoolean(false);
-        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");
-            }
-
-            _region = (ITextRegionCollection) region;
-
-            _context =
-                       IStructuredDocumentContextFactory.INSTANCE.getContext(
-                               ((IStructuredDocumentRegion) _region)
-                                       .getParentDocument(), _region
-                                       .getStartOffset());
-
-            if (_context == null)
-            {
-                throw new NoElementException(
-                        "Couldn't acquire structured document context");
-            }
-
-            final IDOMContextResolver resolver =
-                                                 IStructuredDocumentContextResolverFactory.INSTANCE
-                                                         .getDOMContextResolver(_context);
-
-            if (resolver == null)
-            {
-                throw new NoElementException("Couldn't acquire dom resolver");
-            }
-
-            _node = resolver.getNode();
-
-            if (_node == null)
-            {
-                throw new NoElementException("Couldn't get Node from region");
-            }
-        }
-
-        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);
-        }
-        public boolean isInitialized()
-        {
-            return _isInitialized.get();
-        }
-
-        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 b31f609..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.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.jsf.core.internal.tld;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.text.IDocument;
-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.contentmodel.tld.provisional.TLDElementDeclaration;
-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) {
-				return ((TLDDocument) doc).getUri();
-			}
-		}
-		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);
-                }
-            }
-	    }
-        // 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/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 4f2ee35..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";
-
-	/**
-	 * attribute tagname
-	 */
-	final static public String TAG_ATTRIBUTE = "attribute";
-
-	/**
-	 * convertDateTime tagname
-	 */
-	final static public String TAG_CONVERTDATETIME = "convertDateTime";
-
-	/**
-	 * converter tagname
-	 */
-	final static public String TAG_CONVERTER = "converter";
-
-	/**
-	 * convertNumber tagname
-	 */
-	final static public String TAG_CONVERTNUMBER = "convertNumber";
-
-	/**
-	 * facet tagname
-	 */
-	final static public String TAG_FACET = "facet";
-
-	/**
-	 * loadBundle tagname
-	 */
-	final static public String TAG_LOADBUNDLE = "loadBundle";
-
-	/**
-	 * param tagname
-	 */
-	final static public String TAG_PARAM = "param";
-
-    /**
-     * phaseListener tagname
-     */
-	final static public String TAG_PHASELISTENER = "phaseListener";
-	
-	/**
-	 * selectItem tagname
-	 */
-	final static public String TAG_SELECTITEM = "selectItem";
-
-	/**
-	 * selectItems tagname
-	 */
-	final static public String TAG_SELECTITEMS = "selectItems";
-
-	/**
-	 * setPropertyActionListener tagname
-	 */
-	final static public String TAG_SETPROPERTYACTIONLISTENER = "setPropertyActionListener";
-	
-	/**
-	 * subview tagname
-	 */
-	final static public String TAG_SUBVIEW = "subview";
-
-	/**
-	 * validateDoubleRange tagname
-	 */
-	final static public String TAG_VALIDATEDOUBLERANGE = "validateDoubleRange";
-
-	/**
-	 * validateLength tagname
-	 */
-	final static public String TAG_VALIDATELENGTH = "validateLength";
-
-	/**
-	 * validateLongRange tagname
-	 */
-	final static public String TAG_VALIDATELONGRANGE = "validateLongRange";
-
-	/**
-	 * validator tagname
-	 */
-	final static public String TAG_VALIDATOR = "validator";
-
-	/**
-	 * valueChangeListener tagname
-	 */
-	final static public String TAG_VALUECHANGELISTENER = "valueChangeListener";
-
-	/**
-	 * verbatim tagname
-	 */
-	final static public String TAG_VERBATIM = "verbatim";
-
-	/**
-	 * view tagname
-	 */
-	final static public String TAG_VIEW = "view";
-
-	/**
-	 * column tagname
-	 */
-	final static public String TAG_COLUMN = "column";
-
-	/**
-	 * commandButton tagname
-	 */
-	final static public String TAG_COMMANDBUTTON = "commandButton";
-
-	/**
-	 * commandLink tagname
-	 */
-	final static public String TAG_COMMANDLINK = "commandLink";
-
-	/**
-	 * dataTable tagname
-	 */
-	final static public String TAG_DATATABLE = "dataTable";
-
-	/**
-	 * form tagname
-	 */
-	final static public String TAG_FORM = "form";
-
-	/**
-	 * graphicImage tagname
-	 */
-	final static public String TAG_GRAPHICIMAGE = "graphicImage";
-
-	/**
-	 * inputHidden tagname
-	 */
-	final static public String TAG_INPUTHIDDEN = "inputHidden";
-
-	/**
-	 * inputSecret tagname
-	 */
-	final static public String TAG_INPUTSECRET = "inputSecret";
-
-	/**
-	 * inputText tagname
-	 */
-	final static public String TAG_INPUTTEXT = "inputText";
-
-	/**
-	 * inputTextarea tagname
-	 */
-	final static public String TAG_INPUTTEXTAREA = "inputTextarea";
-
-	/**
-	 * message tagname
-	 */
-	final static public String TAG_MESSAGE = "message";
-
-	/**
-	 * messages tagname
-	 */
-	final static public String TAG_MESSAGES = "messages";
-
-	/**
-	 * outputFormat tagname
-	 */
-	final static public String TAG_OUTPUTFORMAT = "outputFormat";
-
-	/**
-	 * outputLabel tagname
-	 */
-	final static public String TAG_OUTPUTLABEL = "outputLabel";
-
-	/**
-	 * outputLink tagname
-	 */
-	final static public String TAG_OUTPUTLINK = "outputLink";
-
-	/**
-	 * outputText tagname
-	 */
-	final static public String TAG_OUTPUTTEXT = "outputText";
-
-	/**
-	 * panelGrid tagname
-	 */
-	final static public String TAG_PANELGRID = "panelGrid";
-
-	/**
-	 * panelGroup tagname
-	 */
-	final static public String TAG_PANELGROUP = "panelGroup";
-
-	/**
-	 * selectBooleanCheckbox tagname
-	 */
-	final static public String TAG_SELECTBOOLEANCHECKBOX = "selectBooleanCheckbox";
-
-	/**
-	 * selectManyCheckbox tagname
-	 */
-	final static public String TAG_SELECTMANYCHECKBOX = "selectManyCheckbox";
-
-	/**
-	 * selectManyListbox tagname
-	 */
-	final static public String TAG_SELECTMANYLISTBOX = "selectManyListbox";
-
-	/**
-	 * selectManyMenu tagname
-	 */
-	final static public String TAG_SELECTMANYMENU = "selectManyMenu";
-
-	/**
-	 * selectOneListbox tagname
-	 */
-	final static public String TAG_SELECTONELISTBOX = "selectOneListbox";
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONEMENU = "selectOneMenu";
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONERADIO = "selectOneRadio";
-
-    // 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";
-
-	/**
-	 * acceptcharset tag attribute name
-	 */
-	final static public String ATTR_ACCEPTCHARSET = "acceptcharset";
-
-	/**
-	 * accesskey tag attribute name
-	 */
-	final static public String ATTR_ACCESSKEY = "accesskey";
-
-	/**
-	 * action tag attribute name
-	 */
-	final static public String ATTR_ACTION = "action";
-
-	/**
-	 * actionListener tag attribute name
-	 */
-	final static public String ATTR_ACTIONLISTENER = "actionListener";
-
-	/**
-	 * alt tag attribute name
-	 */
-	final static public String ATTR_ALT = "alt";
-
-	/**
-	 * basename tag attribute name
-	 */
-	final static public String ATTR_BASENAME = "basename";
-
-	/**
-	 * bgcolor tag attribute name
-	 */
-	final static public String ATTR_BGCOLOR = "bgcolor";
-
-	/**
-	 * binding tag attribute name
-	 */
-	final static public String ATTR_BINDING = "binding";
-
-	/**
-	 * border tag attribute name
-	 */
-	final static public String ATTR_BORDER = "border";
-
-	/**
-	 * cellpadding tag attribute name
-	 */
-	final static public String ATTR_CELLPADDING = "cellpadding";
-
-	/**
-	 * cellspacing tag attribute name
-	 */
-	final static public String ATTR_CELLSPACING = "cellspacing";
-
-	/**
-	 * charset tag attribute name
-	 */
-	final static public String ATTR_CHARSET = "charset";
-
-	/**
-	 * cols tag attribute name
-	 */
-	final static public String ATTR_COLS = "cols";
-
-	/**
-	 * columnClasses tag attribute name
-	 */
-	final static public String ATTR_COLUMNCLASSES = "columnClasses";
-
-	/**
-	 * columns tag attribute name
-	 */
-	final static public String ATTR_COLUMNS = "columns";
-
-	/**
-	 * converterId tag attribute name
-	 */
-	final static public String ATTR_CONVERTERID = "converterId";
-
-	/**
-	 * coords tag attribute name
-	 */
-	final static public String ATTR_COORDS = "coords";
-
-	/**
-	 * currencyCode tag attribute name
-	 */
-	final static public String ATTR_CURRENCYCODE = "currencyCode";
-
-	/**
-	 * currencySymbol tag attribute name
-	 */
-	final static public String ATTR_CURRENCYSYMBOL = "currencySymbol";
-
-	/**
-	 * dateStyle tag attribute name
-	 */
-	final static public String ATTR_DATESTYLE = "dateStyle";
-
-	/**
-	 * dir tag attribute name
-	 */
-	final static public String ATTR_DIR = "dir";
-
-	/**
-	 * disabled tag attribute name
-	 */
-	final static public String ATTR_DISABLED = "disabled";
-
-	/**
-	 * errorClass tag attribute name
-	 */
-	final static public String ATTR_ERRORCLASS = "errorClass";
-
-	/**
-	 * errorStyle tag attribute name
-	 */
-	final static public String ATTR_ERRORSTYLE = "errorStyle";
-
-	/**
-	 * escape tag attribute name
-	 */
-	final static public String ATTR_ESCAPE = "escape";
-
-	/**
-	 * fatalClass tag attribute name
-	 */
-	final static public String ATTR_FATALCLASS = "fatalClass";
-
-	/**
-	 * fatalStyle tag attribute name
-	 */
-	final static public String ATTR_FATALSTYLE = "fatalStyle";
-
-	/**
-	 * first tag attribute name
-	 */
-	final static public String ATTR_FIRST = "first";
-
-	/**
-	 * footerClass tag attribute name
-	 */
-	final static public String ATTR_FOOTERCLASS = "footerClass";
-
-	/**
-	 * for tag attribute name
-	 */
-	final static public String ATTR_FOR = "for";
-
-	/**
-	 * frame tag attribute name
-	 */
-	final static public String ATTR_FRAME = "frame";
-
-	/**
-	 * globalOnly tag attribute name
-	 */
-	final static public String ATTR_GLOBEONLY = "globalOnly";
-
-	/**
-	 * headerClass tag attribute name
-	 */
-	final static public String ATTR_HEADERCLASS = "headerClass";
-
-	/**
-	 * hreflang tag attribute name
-	 */
-	final static public String ATTR_HREFLANG = "hreflang";
-
-	/**
-	 * id tag attribute name
-	 */
-	final static public String ATTR_ID = "id";
-
-	/**
-	 * image tag attribute name
-	 */
-	final static public String ATTR_IMAGE = "image";
-
-	/**
-	 * immediate tag attribute name
-	 */
-	final static public String ATTR_IMMEDIATE = "immediate";
-
-	/**
-	 * infoClass tag attribute name
-	 */
-	final static public String ATTR_INFOCLASS = "infoClass";
-
-	/**
-	 * infoStyle tag attribute name
-	 */
-	final static public String ATTR_INFOSTYLE = "infoStyle";
-
-	/**
-	 * itemDescription tag attribute name
-	 */
-	final static public String ATTR_ITEMDESCRIPTION = "itemDescription";
-
-	/**
-	 * itemDisabled tag attribute name
-	 */
-	final static public String ATTR_ITEMDISABLED = "itemDisabled";
-
-	/**
-	 * itemLabel tag attribute name
-	 */
-	final static public String ATTR_ITEMLABEL = "itemLabel";
-
-	/**
-	 * itemValue tag attribute name
-	 */
-	final static public String ATTR_ITEMVALUE = "itemValue";
-
-	/**
-	 * lang tag attribute name
-	 */
-	final static public String ATTR_LANG = "lang";
-
-	/**
-	 * layout tag attribute name
-	 */
-	final static public String ATTR_LAYOUT = "layout";
-
-	/**
-	 * locale tag attribute name
-	 */
-	final static public String ATTR_LOCALE = "locale";
-
-	/**
-	 * maximum tag attribute name
-	 */
-	final static public String ATTR_MAXIMUM = "maximum";
-
-	/**
-	 * minimum tag attribute name
-	 */
-	final static public String ATTR_MINIMUM = "minimum";
-
-	/**
-	 * name tag attribute name
-	 */
-	final static public String ATTR_NAME = "name";
-
-	/**
-	 * onblur tag attribute name
-	 */
-	final static public String ATTR_ONBLUR = "onblur";
-
-	/**
-	 * onchange tag attribute name
-	 */
-	final static public String ATTR_ONCHANGE = "onchange";
-
-	/**
-	 * onclick tag attribute name
-	 */
-	final static public String ATTR_ONCLICK = "onclick";
-
-	/**
-	 * ondblclick tag attribute name
-	 */
-	final static public String ATTR_ONDBLCLICK = "ondblclick";
-
-	/**
-	 * onfocus tag attribute name
-	 */
-	final static public String ATTR_ONFOCUS = "onfocus";
-
-	/**
-	 * onkeydown tag attribute name
-	 */
-	final static public String ATTR_ONKEYDOWN = "onkeydown";
-
-	/**
-	 * onkeypress tag attribute name
-	 */
-	final static public String ATTR_ONKEYPRESS = "onkeypress";
-
-	/**
-	 * onkeyup tag attribute name
-	 */
-	final static public String ATTR_ONKEYUP = "onkeyup";
-
-	/**
-	 * onmousedown tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEDOWN = "onmousedown";
-
-	/**
-	 * onmousemove tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEMOVE = "onmousemove";
-
-	/**
-	 * onmouseout tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOUT = "onmouseout";
-
-	/**
-	 * onmouseover tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOVER = "onmouseover";
-
-	/**
-	 * onmouseup tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEUP = "onmouseup";
-
-	/**
-	 * onselect tag attribute name
-	 */
-	final static public String ATTR_ONSELECT = "onselect";
-
-	/**
-	 * pattern tag attribute name
-	 */
-	final static public String ATTR_PATTERN = "pattern";
-
-	/**
-	 * readonly tag attribute name
-	 */
-	final static public String ATTR_READONLY = "readonly";
-
-	/**
-	 * rel tag attribute name
-	 */
-	final static public String ATTR_REL = "rel";
-
-	/**
-	 * rendered tag attribute name
-	 */
-	final static public String ATTR_RENDERED = "rendered";
-
-	/**
-	 * rev tag attribute name
-	 */
-	final static public String ATTR_REV = "rev";
-
-	/**
-	 * rowClasses tag attribute name
-	 */
-	final static public String ATTR_ROWCLASSES = "rowClasses";
-
-	/**
-	 * rows tag attribute name
-	 */
-	final static public String ATTR_ROWS = "rows";
-
-	/**
-	 * rules tag attribute name
-	 */
-	final static public String ATTR_RULES = "rules";
-
-	/**
-	 * shape tag attribute name
-	 */
-	final static public String ATTR_SHAPE = "shape";
-
-	/**
-	 *  showDetail tag attribute name
-	 */
-	final static public String ATTR_SHOWDETAIL = "showDetail";
-
-	/**
-	 * showSummary tag attribute name
-	 */
-	final static public String ATTR_SHOWSUMMARY = "showSummary";
-
-	/**
-	 * size tag attribute name
-	 */
-	final static public String ATTR_SIZE = "size";
-
-	/**
-	 * style tag attribute name
-	 */
-	final static public String ATTR_STYLE = "style";
-
-	/**
-	 * styleClass tag attribute name
-	 */
-	final static public String ATTR_STYLECLASS = "styleClass";
-
-	/**
-	 * summary tag attribute name
-	 */
-	final static public String ATTR_SUMMARY = "summary";
-
-	/**
-	 * tabindex tag attribute name
-	 */
-	final static public String ATTR_TABINDEX = "tabindex";
-
-	/**
-	 * target tag attribute name
-	 */
-	final static public String ATTR_TARGET = "target";
-
-	/**
-	 * timeStyle tag attribute name
-	 */
-	final static public String ATTR_TIMESTYLE = "timeStyle";
-
-	/**
-	 * title tag attribute name
-	 */
-	final static public String ATTR_TITLE = "title";
-
-	/**
-	 * tooltip tag attribute name
-	 */
-	final static public String ATTR_TOOLTIP = "tooltip";
-
-	/**
-	 * type tag attribute name
-	 */
-	final static public String ATTR_TYPE = "type";
-
-	/**
-	 * url tag attribute name
-	 */
-	final static public String ATTR_URL = "url";
-
-	/**
-	 * validatorId tag attribute name
-	 */
-	final static public String ATTR_VALIDATORID = "validatorId";
-
-	/**
-	 * value tag attribute name
-	 */
-	final static public String ATTR_VALUE = "value";
-
-	/**
-	 * var tag attribute name
-	 */
-	final static public String ATTR_VAR = "var";
-
-	/**
-	 * warnClass tag attribute name
-	 */
-	final static public String ATTR_WARNCLASS = "warnClass";
-
-	/**
-	 * warnStyle tag attribute name
-	 */
-	final static public String ATTR_WARNSTYLE = "warnStyle";
-
-	/**
-	 * width tag attribute name
-	 */
-	final static public String ATTR_WIDTH = "width";
-
-}
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 daf4e7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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) {
-				IPath path = classpathEntries[i].getPath().append(
-						getFilePath(baseName)).removeFirstSegments(1);
-				path = javaProject.getProject().getFullPath().append(path);
-				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
-						path);
-				if (file.exists()) {
-					return file;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static IPath getFilePath(String baseName) {
-		IPath path = new Path(baseName.replace('.', '/'));//$NON-NLS-1$
-		path = path.addFileExtension("properties");//$NON-NLS-1$
-		return path;
-	}
-
-	private static IStorage getJarFile(IJavaProject javaProject, String baseName)
-			throws JavaModelException {
-		IClasspathEntry[] roots = javaProject.getRawClasspath();
-		for (int i = 0; i < roots.length; i++) {
-			if (roots[i].getEntryKind() != IClasspathEntry.CPE_LIBRARY) {
-				continue;
-			}
-
-			IPackageFragmentRoot[] packageFragmentRoots = javaProject
-					.findPackageFragmentRoots(roots[i]);
-			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('.');//$NON-NLS-1$
-		if (index == -1) {
-			return "";//$NON-NLS-1$
-		}
-        return baseName.substring(0, index);
-	}
-
-	private static String getFileName(String baseName) {
-		int index = baseName.lastIndexOf('.');//$NON-NLS-1$
-		if (index == -1) {
-			return baseName + ".properties";
-		}
-        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("");
-                possibleSuffices.add("_"+language);
-                if (country != null)
-                {
-                    possibleSuffices.add(0, "_"+language + "_" + country);
-                    if (variant != null)
-                    {
-                        possibleSuffices.add(0, "_"+language+"_"+country+"_"+variant);
-                    }
-                }
-                _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 013a973..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());
-        }
-        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 943fecb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
+++ /dev/null
@@ -1,172 +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;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigLocater} that provides common
- * locater functionality. {@link IJSFAppConfigLocater} implementations should
- * 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.
-	 */
-	protected JSFAppConfigManager manager = null;
-
-	/**
-	 * Set of known {@link IJSFAppConfigProvider} instances.
-	 */
-	protected Set configProviders = new LinkedHashSet();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#setJSFAppConfigManager(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager) {
-		this.manager = manager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#getJSFAppConfigManager()
-	 */
-	public JSFAppConfigManager getJSFAppConfigManager() {
-		return manager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#startLocating()
-	 */
-	public abstract void startLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#stopLocating()
-	 */
-	public abstract void stopLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#getJSFAppConfigProviders()
-	 */
-	public Set 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(IJSFAppConfigProvider configProvider) {
-		boolean added = configProviders.add(configProvider);
-		if (added && manager != null) {
-			configProvider.setJSFAppConfigLocater(this);
-			manager.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(IJSFAppConfigProvider configProvider) {
-		if (configProvider != null) {
-			configProvider.releaseFacesConfigModel();
-		}
-		boolean removed = configProviders.remove(configProvider);
-		if (removed && manager != null) {
-			manager.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(Set newConfigProviders) {
-		if (newConfigProviders != null) {
-			LinkedHashSet oldConfigProviders = new LinkedHashSet();
-			//iterate over existing set
-			Iterator itConfigProviders = configProviders.iterator();
-			while (itConfigProviders.hasNext()) {
-				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
-			Iterator itOldConfigProviders = oldConfigProviders.iterator();
-			while (itOldConfigProviders.hasNext()) {
-				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
-			Iterator itNewConfigProviders = newConfigProviders.iterator();
-			while (itNewConfigProviders.hasNext()) {
-				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 java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		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 50ba81a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.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.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() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-		if (facesConfigArtifactEdit != null) {
-			facesConfigArtifactEdit.dispose();
-		}
-	}
-
-	/*
-	 * (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 5df2941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
+++ /dev/null
@@ -1,305 +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() {
-		IModelProvider provider = ModelProviderManager.getModelProvider(getJSFAppConfigManager().getProject());
-		return provider.getModelObject();
-	}
-
-	/*
-	 * (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);		
-//		System.out.println(((EObject)webApp).eDeliver());
-		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(manager.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 4cc953d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java
+++ /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:
- *    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.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 = manager.getProject();
-				if (project != null) {
-					IVirtualFolder webContentFolder = JSFAppConfigUtils.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 6c0a6a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.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.jsf.core.jsfappconfig;
-
-import java.util.Set;
-
-/**
- * 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>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigLocater {
-
-	/**
-	 * Sets the {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @param manager {@link JSFAppConfigManager} instance to be set.
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager);
-
-	/**
-	 * Gets the {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @return {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 */
-	public JSFAppConfigManager getJSFAppConfigManager();
-
-	/**
-	 * Starts locating JSF application configuration resources.
-	 */
-	public void startLocating();
-
-	/**
-	 * Stops locating JSF application configuration resources.
-	 */
-	public void stopLocating();
-
-	/**
-	 * Gets the set of {@link IJSFAppConfigProvider} instances that this
-	 * locater has located.
-	 * 
-	 * @return set of {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set 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 a351eaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.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.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>
- * 
- * @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 7a1e581..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"));
-        converters.add(createForClassConverter("java.lang.Byte", "javax.faces.convert.ByteConverter"));
-        converters.add(createForClassConverter("java.lang.Character", "javax.faces.convert.CharacterConverter"));
-        converters.add(createForClassConverter("java.lang.Double", "javax.faces.convert.DoubleConverter"));
-        converters.add(createForClassConverter("java.lang.Float", "javax.faces.convert.FloatConverter"));
-        converters.add(createForClassConverter("java.lang.Integer", "javax.faces.convert.IntegerConverter"));
-        converters.add(createForClassConverter("java.lang.Long", "javax.faces.convert.LongConverter"));
-        converters.add(createForClassConverter("java.lang.Short", "javax.faces.converter.ShortConverter"));
-		//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 3d967f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
+++ /dev/null
@@ -1,254 +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:///";
-
-	/**
-	 * Suffix required to turn filename into a JAR URI.
-	 */
-	public static final String FACES_CONFIG_IN_JAR_SUFFIX = "!/META-INF/faces-config.xml";
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * 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()
-	{
-		JarFile 		jarFile = null;
-		File    		tempFile = null;
-		OutputStream	tempFileStream = null;
-
-		try
-		{
-			jarFile = new JarFile(filename, false);
-			ZipEntry entry = jarFile.getEntry("META-INF/faces-config.xml");
-
-			if (entry != null)
-			{
-				InputStream stream = jarFile.getInputStream(entry);
-	
-				tempFile = File.createTempFile("tempfile", ".xml");
-				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) {
-							facesConfig = (FacesConfigType)resourceContents.get(0);
-							if (facesConfig != null) {
-								jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-							}
-						}
-					}
-				} catch(IllegalStateException ise) {
-					//log error
-					logLoadError(ise);
-				} catch(IOException ioe) {
-					//log error
-					logLoadError(ioe);
-				}
-			}
-
-			return facesConfig;
-		}
-		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 04d2ce4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
+++ /dev/null
@@ -1,804 +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.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.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.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.core.runtime.QualifiedName;
-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.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-/**
- * JSFAppConfigManager provides an entry point to an entire JSF application
- * configuration, which is defined in one or more application configuration
- * resource files.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigManager implements IResourceChangeListener {
-
-	/**
-	 * Key that is used for the IProject instance's session property that
-	 * holds a JSFAppConfigManager instance.
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(JSFCorePlugin.PLUGIN_ID, "JSFAppConfigManager"); //$NON-NLS-1$
-
-	/**
-	 * IProject instance to which this JSFAppConfigManager instance is keyed.
-	 */
-	protected IProject project = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigLocater} instances.
-	 */
-	protected List configLocaters = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigProvidersChangeListener} instances.
-	 */
-	protected List configProvidersChangeListeners = null;
-
-	/**
-	 * Map of application configuration model EMF classes to
-	 * {@link IFacesConfigChangeListener} instances.
-	 */
-	protected Map facesConfigChangeListeners = null;
-
-	/**
-	 * Single {@link FacesConfigChangeAdapter} instance.
-	 */
-	protected FacesConfigChangeAdapter facesConfigChangeAdapter = null;
-
-	/**
-	 * Gets a JSFAppConfigManager instance that is keyed to the passed IProject
-	 * parameter. May return null if the project is not valid or if a
-	 * CoreException is thrown while attempting to get or set the instance as
-	 * a session property.
-	 * 
-	 * @param project IProject instance to which the returned
-	 * JSFAppConfigManager instance is keyed.
-	 * @return JSFAppConfigManager instance, or null.
-	 */
-	public static synchronized JSFAppConfigManager getInstance(IProject project) {
-		JSFAppConfigManager manager = null;
-		if (JSFAppConfigUtils.isValidJSFProject(project)) {
-			manager = getFromSessionProperty(project);
-			if (manager == null) {
-				manager = new JSFAppConfigManager(project);
-			}
-		}
-		return manager;
-	}
-
-	/**
-	 * Attempts to get a JSFAppConfigManager instance from a session property
-	 * of the passed IProject instance. Will return null if the session
-	 * property has not yet been set.
-	 * 
-	 * @param project IProject instance from which to retrieve the
-	 * JSFAppConfigManager instance.
-	 * @return JSFAppConfigManager instance, or null.
-	 */
-	protected static JSFAppConfigManager getFromSessionProperty(IProject project) {
-		JSFAppConfigManager manager = null;
-		try {
-			Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY);
-			if (obj instanceof JSFAppConfigManager) {
-				manager = (JSFAppConfigManager)obj;
-			}
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		}
-		return manager;
-	}
-
-	/**
-	 * Sets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void setAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, this);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Unsets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void unsetAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, null);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Constructor is private to prevent direct instantiation; call
-	 * getInstance(IProject).
-	 * 
-	 * @param project IProject instance to which the new JSFAppConfigManager
-	 * instance is keyed.
-	 */
-	private JSFAppConfigManager(IProject project) {
-		this.project = project;
-		initialize();
-	}
-
-	/**
-	 * Gets this instance's IProject instance.
-	 * 
-	 * @return This instance's IProject instance.
-	 */
-	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>
-	 * 	<li>setting instance as a session property of the IProject instance, </li>
-	 *  <li>adding a resource change listener to the workspace.</li>
-	 * </ul>
-	 */
-	protected void initialize() {
-		//create collections
-		facesConfigChangeListeners = new HashMap();
-		configProvidersChangeListeners = new ArrayList();
-		configLocaters = new ArrayList();
-		//populate initial set of locaters
-		populateConfigLocaters();
-		//instruct locaters to start locating
-		startConfigLocaters();
-		//set as session property of project
-		setAsSessionProperty();
-		//add resource change listener
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/**
-	 * Populates configLocaters Set with "built-in" set of
-	 * {@link IJSFAppConfigLocater} implementations.
-	 */
-	protected void populateConfigLocaters() {
-		//implicit runtime-provided configuration
-		IJSFAppConfigLocater implicitRuntimeConfigLocater = new ImplicitRuntimeJSFAppConfigLocater();
-		implicitRuntimeConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(implicitRuntimeConfigLocater);
-		//default ("/WEB-INF/faces-config.xml") locater
-		IJSFAppConfigLocater defaultConfigLocater = new DefaultJSFAppConfigLocater();
-		defaultConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(defaultConfigLocater);
-		//web.xml context-parameter specified locater
-		IJSFAppConfigLocater contextParamConfigLocater = new ContextParamSpecifiedJSFAppConfigLocater();
-		contextParamConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(contextParamConfigLocater);
-		//runtime classpath locater
-		IJSFAppConfigLocater classpathConfigLocater = new RuntimeClasspathJSFAppConfigLocater();
-		classpathConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(classpathConfigLocater);
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to start
-	 * locating JSF application configuration resources.
-	 */
-	protected void startConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.startLocating();
-		}
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to stop
-	 * locating JSF application configuration resources.
-	 */
-	protected void stopConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.stopLocating();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		if (delta.getKind() == IResourceDelta.CHANGED) {
-			IResourceDelta[] removedDeltas = delta.getAffectedChildren(IResourceDelta.REMOVED);
-			if (removedDeltas.length == 1) {
-				IResourceDelta removedDelta = removedDeltas[0];
-				IResource removedResource = removedDelta.getResource();
-				if (removedResource != null && removedResource == project) {
-					IResourceDelta[] addedDeltas = delta.getAffectedChildren(IResourceDelta.ADDED);
-					if (addedDeltas.length == 1) {
-						IResourceDelta addedDelta = addedDeltas[0];
-						IResource addedResource = addedDelta.getResource();
-						if (addedResource instanceof IProject) {
-							changeProject((IProject)addedResource);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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.
-	 */
-	protected void changeProject(IProject newProject) {
-		this.project = newProject;
-		stopConfigLocaters();
-		startConfigLocaters();
-	}
-
-	/**
-	 * Adds an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener An instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * @return true if added, else false.
-	 */
-	public boolean addJSFAppConfigProvidersChangeListener(IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.add(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) {
-		return configProvidersChangeListeners.remove(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) {
-		JSFAppConfigProvidersChangeEvent event = new JSFAppConfigProvidersChangeEvent(configProvider, eventType);
-		Iterator itListeners = configProvidersChangeListeners.iterator();
-		while (itListeners.hasNext()) {
-			IJSFAppConfigProvidersChangeListener listener =
-				(IJSFAppConfigProvidersChangeListener)itListeners.next();
-			listener.changedJSFAppConfigProviders(event);
-		}
-	}
-
-	/**
-	 * Adds an instance of {@link IFacesConfigChangeListener}. <br>
-	 * <br>
-	 * <b>NOTE:</b> Calling this method will cause all application
-	 * configuration models to be loaded, to ensure that a
-	 * {@link FacesConfigChangeAdapter} has been added to each model.
-	 * 
-	 * @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) {
-		/* 
-		 * Get all models, which will ensure that each one has had a
-		 * FacesConfigChangeAdapter added to it.
-		 */
-		getFacesConfigModels();
-		return facesConfigChangeListeners.put(emfClass, 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) {
-		return facesConfigChangeListeners.remove(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) {
-		Object emfFeature = notification.getFeature();
-		if (emfFeature instanceof EStructuralFeature) {
-			Class emfClass = ((EStructuralFeature)emfFeature).getEType().getInstanceClass();
-			IFacesConfigChangeListener listener = (IFacesConfigChangeListener)facesConfigChangeListeners.get(emfClass);
-			if (listener != null) {
-				listener.notifyChanged(notification);
-			}
-		}
-	}
-
-	/**
-	 * Gets all {@link IJSFAppConfigProvider} instances from all
-	 * {@link IJSFAppConfigLocater} instances.
-	 * 
-	 * @return Set of all {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set getJSFAppConfigProviders() {
-		Set allConfigProviders = new LinkedHashSet();
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			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.
-	 */
-	public List getFacesConfigModels() {
-		List facesConfigModels = new ArrayList();
-		Iterator itConfigProviders = getJSFAppConfigProviders().iterator();
-		while (itConfigProviders.hasNext()) {
-			IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-			FacesConfigType facesConfig = configProvider.getFacesConfigModel();
-			if (facesConfig != null) {
-				facesConfigModels.add(facesConfig);
-			}
-		}
-		return facesConfigModels;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		//remove resource change listener
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.removeResourceChangeListener(this);
-		//remove session property from project
-		unsetAsSessionProperty();
-		//instruct locaters to stop locating
-		stopConfigLocaters();
-		//clear collections
-		configLocaters.clear();
-		configProvidersChangeListeners.clear();
-		facesConfigChangeListeners.clear();
-	}
-
-	/**
-	 * 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 getManagedBeans() {
-		List allManagedBeans = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList managedBeans = facesConfig.getManagedBean();
-			allManagedBeans.addAll(managedBeans);
-		}
-		return allManagedBeans;
-    }
-
-    /**
-     * @return List of all variable resolver class names registered. 
-     */
-    public final List<String> getPropertyResolvers()
-    {
-        final List<String> allPropertyResolvers = new ArrayList<String>();
-        final List applications = getApplications();
-        final Iterator appIterator = applications.iterator();
-        while (appIterator.hasNext())
-        {
-            final ApplicationType  application = (ApplicationType) appIterator.next();
-            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))
-                    {
-                        allPropertyResolvers.add(propClass);
-                    }
-                }
-            }
-        }
-        return allPropertyResolvers;
-	}
-
-	/**
-	 * 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 getValidators() {
-		List allValidators = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList validators = facesConfig.getValidator();
-			allValidators.addAll(validators);
-		}
-		return allValidators;
-	}
-
-	/**
-	 * @return List of all variable resolver class names registered. 
-	 */
-	public final List<String> getVariableResolvers()
-    {
-        final List<String> allVariableResolvers = new ArrayList<String>();
-        final List applications = getApplications();
-        final Iterator appIterator = applications.iterator();
-        while (appIterator.hasNext())
-        {
-            final ApplicationType  application = (ApplicationType) appIterator.next();
-            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))
-                    {
-                        allVariableResolvers.add(varClass);
-                    }
-                }
-            }
-        }
-        return allVariableResolvers;
-    }
-
-	/**
-	 * 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 getConverters() {
-		List allConverters = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList converters = facesConfig.getConverter();
-			allConverters.addAll(converters);
-		}
-		return allConverters;
-	}
-
-	/**
-	 * 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 getNavigationRules() {
-		List allNavigationRules = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList navigationRules = facesConfig.getNavigationRule();
-			allNavigationRules.addAll(navigationRules);
-		}
-		return allNavigationRules;
-	}
-
-	/**
-	 * 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 getNavigationRulesForPage(IFile pageFile) {
-		List navigationRulesForPage = new ArrayList();
-		IPath pageFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(pageFile);
-		if (pageFilePath != null) {
-			String pageFileString = pageFilePath.toString();
-			if (!pageFileString.startsWith("/")) {
-				pageFileString = "/" + pageFileString;
-			}
-			List navigationRules = getNavigationRules();
-			Iterator itNavigationRules = navigationRules.iterator();
-			while (itNavigationRules.hasNext()) {
-				NavigationRuleType navigationRule = (NavigationRuleType)itNavigationRules.next();
-				FromViewIdType fromViewIdType = navigationRule.getFromViewId();
-				if (fromViewIdType != null) {
-					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$
-								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;
-	}
-
-	/**
-	 * 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 getApplications() {
-		List allApplications = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList applications = facesConfig.getApplication();
-			allApplications.addAll(applications);
-		}
-		return allApplications;
-	}
-
-	/**
-	 * 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 getFactories() {
-		List allFactories = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList factories = facesConfig.getFactory();
-			allFactories.addAll(factories);
-		}
-		return allFactories;
-	}
-
-	/**
-	 * 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 getComponents() {
-		List allComponents = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList components = facesConfig.getComponent();
-			allComponents.addAll(components);
-		}
-		return allComponents;
-	}
-
-	/**
-	 * 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 getReferencedBeans() {
-		List allReferencedBeans = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList referencedBeans = facesConfig.getReferencedBean();
-			allReferencedBeans.addAll(referencedBeans);
-		}
-		return allReferencedBeans;
-	}
-
-	/**
-	 * 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 getRenderKits() {
-		List allRenderKits = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList renderKits = facesConfig.getRenderKit();
-			allRenderKits.addAll(renderKits);
-		}
-		return allRenderKits;
-	}
-
-	/**
-	 * 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 getLifecycles() {
-		List allLifecycles = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList lifecycles = facesConfig.getLifecycle();
-			allLifecycles.addAll(lifecycles);
-		}
-		return allLifecycles;
-	}
-
-    /**
-     * @return the list of all resource bundles declared in all the FacesConfig
-     * configurations found.
-     */
-    public List getResourceBundles()
-    {
-        List allResourceBundles = new ArrayList();
-        List facesConfigs = getFacesConfigModels();
-        Iterator itFacesConfigs = facesConfigs.iterator();
-        while (itFacesConfigs.hasNext()) {
-            FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-            for (final Iterator applicationIt = facesConfig.getApplication().iterator(); applicationIt.hasNext();)
-            {
-                ApplicationType appType = (ApplicationType) applicationIt.next();
-                allResourceBundles.addAll(appType.getResourceBundle());
-            }
-        }
-        return allResourceBundles;
-    }
-    
-	/**
-	 * Adds this instance's {@link FacesConfigChangeAdapter} instance to the
-	 * passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void addFacesConfigChangeAdapter(FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			if (facesConfigChangeAdapter == null) {
-				facesConfigChangeAdapter = new FacesConfigChangeAdapter();
-			}
-			facesConfig.eAdapters().add(facesConfigChangeAdapter);
-		}
-	}
-
-	/**
-	 * Removes this instance's {@link FacesConfigChangeAdapter} instance from
-	 * the passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void removeFacesConfigChangeAdapter(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(Notification notification) {
-			super.notifyChanged(notification);
-			notifyFacesConfigChangeListeners(notification);
-		}
-	}
-
-}
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 c74b44e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java
+++ /dev/null
@@ -1,372 +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.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.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.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.
-	 */
-	public static IVirtualFolder getWebContentFolder(IProject project) {
-		IVirtualFolder folder = null;
-		IVirtualComponent component = ComponentCore.createComponent(project);
-		if (component != null) {
-			folder = component.getRootFolder();
-		}
-		return folder;
-	}
-
-	/**
-	 * 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 7cb04b0..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(manager.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 4359d21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,72 +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.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 = manager.getProject();
-		IVirtualFolder webContentFolder = JSFAppConfigUtils.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/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 dc851a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.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.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
- */
-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";
-
-	/**
-	 * @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());
-		}
-		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 9c77f03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.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.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>
- */
-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 c12f3c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.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.core.jsflibraryconfiguration;
-
-/**
- * A reference to a plugin-defined JSF Library
- *
- * <p><b>Provisional API - subject to change</b></p>
- */
-@SuppressWarnings("deprecation")
-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 b03ece3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.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.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>
- */
-public interface JSFLibraryReferenceServerSupplied extends
-		JSFLibraryReference {
-	
-	/**
-	 * Constant used for server supplied virtual JSF Library referencew
-	 */
-	public static final String ID = "_ServerSupplied_";
-
-}
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 c0ba3a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
+++ /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
- *******************************************************************************/
-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>
- */
-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 b4e14d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.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.core.jsflibraryconfiguration;
-
-/**
- * Enumeration of JavaServer Faces Versions
- *
- * <p><b>Provisional API - subject to change</b></p>
- */
-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 ad6d8fe..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
- *
- */
-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: ");
-		buf.append(getId());
-		buf.append(", label: ");
-		buf.append(getLabel());
-		buf.append(", isDeployed: ");
-		buf.append(isDeployed());
-		buf.append(", isImpl: ");
-		buf.append(isJSFImplementation());
-		buf.append(", version: ");
-		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 cb15c67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
+++ /dev/null
@@ -1,76 +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
- */
-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 bb847ae..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;
-
-/**
- *
- */
-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: (");
-		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 6ab76ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java
+++ /dev/null
@@ -1,49 +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
- *
- */
-public class JSFLibraryReferenceServerSuppliedImpl 
-	extends AbstractJSFLibraryReferenceImpl 
-	implements JSFLibraryReferenceServerSupplied {
-	
-	/**
-	 * Constructor
-	 */
-	public JSFLibraryReferenceServerSuppliedImpl(){
-		//TODO: replace label with constant
-		super(JSFLibraryReferenceServerSupplied.ID, "Server Supplied", true);
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer("ServerSupplied: (");
-		buf.append(super.toString());
-		buf.append(")");
-		
-		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 833ed20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
+++ /dev/null
@@ -1,43 +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  
- *
- */
-@SuppressWarnings("deprecation")
-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: (");
-		buf.append(super.toString());
-		buf.append(")");
-		
-		return buf.toString();
-	}
-}
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 e260f69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.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.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>
- * 
- */
-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 7c280ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java
+++ /dev/null
@@ -1,146 +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
- */
-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 64e707e..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 getURIDisplayLabel();
-	}
-
-	/**
-	 * return "HTML 4.0"
-	 */
-	protected String getURIDisplayLabel() {
-		return "HTML 4.0";
-	}
-
-}
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 95ed2a0..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 "JSP Tags";
-	}
-
-	@Override
-	protected String getURIDisplayLabel() {		
-		return "JSP";
-	}
-
-}
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 0275afc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataLocator.java
+++ /dev/null
@@ -1,170 +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.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;
-	
-	/**
-	 * 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 tld = tldRecs[i];
-			if (uri.equals(tld.getDescriptor().getURI()))
-				return tld;
-		}
-		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(ITaglibDescriptor event) {
-//		if (event.getURI() != null && event.getURI().equals(uri)){
-//			if (!_notificationEventOccuring){
-//				_notificationEventOccuring = true;
-//				int type = adaptTagLibEvent(event);
-//				IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, uri, type);
-//				fireEvent(mdEvent);						
-//				_notificationEventOccuring = false;
-//			}
-//		}
-//	}
-
-//	private int adaptTagLibEvent(ITaglibRecordEvent event) {
-//		switch (event.getType()){
-//		case ITaglibRecordEvent.ADDED:
-//			return IMetaDataChangeNotificationEvent.ADDED;
-//		case ITaglibRecordEvent.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 73696da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataTLDTranslator.java
+++ /dev/null
@@ -1,143 +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.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);
-			
-		}
-	}
-
-	/* (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/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 e6e69ca..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, "Failed membership constraint", complement.toArray());
-    }
-
-}
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 11bce86..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");
-        }
-        
-        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 595d48f..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, "");
-        }
-        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 f3a3790..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
+++ /dev/null
@@ -1,840 +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.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.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;
-
-/**
- * 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";
-    private static final String ORG_ECLIPSE_JST_JSF_DESIGNTIME_APPMGR_PREFS = "org.eclipse.jst.jsf.designtime.appmgr.prefs";
-
-    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        DEFAULT_VIEW_HANDLER_ID                          = "org.eclipse.jst.jsf.designtime.view.jspviewhandler";          //$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);
-        _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",
-                            new Throwable(
-                                    "This exception is only to record a stack trace"));
-        }
-    }
-
-    private static class ViewHandlerManager
-    {
-        private final PropertyFileManager _propertyFileManager;
-
-        ViewHandlerManager(final PropertyFileManager properties)
-        {
-            _propertyFileManager = properties;
-        }
-
-        public synchronized void removeViewHandler(final IProject project)
-        {
-            final String viewHandlerId = _propertyFileManager
-                    .getProperty(PERSIST_PROPERTY_NAME_VIEW_HANDLER,
-                            DEFAULT_VIEW_HANDLER_ID);
-
-            if (viewHandlerId != null)
-            {
-                final ExtensionData<AbstractDTViewHandler> extData =
-                    JSFCorePlugin.getViewHandlers(viewHandlerId);
-                
-                if (extData != null)
-                {
-                    final AbstractDTViewHandler handler = extData.removeInstance(project);
-                    if (handler != null)
-                    {
-                        handler.dispose();
-                    }
-                }
-            }
-        }
-
-        public synchronized IDTViewHandler getViewHandler(
-                final IProject project, final LifecycleListener listener)
-        {
-            final String viewHandlerId = _propertyFileManager
-                    .getProperty(PERSIST_PROPERTY_NAME_VIEW_HANDLER,
-                            DEFAULT_VIEW_HANDLER_ID);
-
-            if (viewHandlerId != null)
-            {
-                ExtensionData<AbstractDTViewHandler> viewHandlers = JSFCorePlugin
-                        .getViewHandlers(viewHandlerId);
-                if (viewHandlers == null)
-                {
-                    viewHandlers = JSFCorePlugin
-                            .getViewHandlers(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");
-                    } catch (final IOException e) {
-                        JSFCorePlugin.log(e, "Problem storing properties");
-                    }
-                }
-            };
-
-            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");
-            }
-        }
-
-        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");
-            } 
-            catch (final IOException ce)
-            {
-                JSFCorePlugin.log(ce, "Problem loading properties");
-            }
-        }
-
-        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 ccecca5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java
+++ /dev/null
@@ -1,206 +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.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 93821e5..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: "
-                                        + 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");
-        }
-        _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 d4a5eee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java
+++ /dev/null
@@ -1,280 +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.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;
-
-/**
- * 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
-{
-    /**
-     * 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);
-                }
-            }
-
-            // 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();
-            }
-        }
-
-        return (ISymbol[]) symbolsList.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    /* (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$
-            }
-
-            // 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 233a1a6..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");
-            // 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());
-                }
-            }
-            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());
-                }
-            }
-            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");
-        }
-    }
-}
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 15d5308..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";
-    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())){
-            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 fa06bbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/Messages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-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 DefaultJSPTagResolver_DisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String PersistedDataTagStrategy_DisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String TagIntrospectingStrategy_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 71a766d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
+++ /dev/null
@@ -1,893 +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.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);
-                }
-                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;
-
-    // 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();
-        }
-        
-        throw new CoreException
-            (new Status(IStatus.ERROR
-                        , "org.eclipse.blah" //$NON-NLS-1$
-                        , 0  //$NON-NLS-1$
-                        ,"model not of expected type" //$NON-NLS-1$
-                        , new Throwable())); //$NON-NLS-1$
-    }
-
-    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);
-                        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();
-        //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") //$NON-NLS-1$
-    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"
-     * @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 Exception("Stack Trace Only"))); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    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();
-        }
-
-        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;
-    }
-
-    /**
-     * 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 40b8fc2..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)
-            {
-                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 f4a8f98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-DefaultJSPTagResolver_DisplayName=Meta-data Driven Resolver
-PersistedDataTagStrategy_DisplayName=Cached Data Tag Resolver
-TagIntrospectingStrategy_DisplayName=Introspecting Tag Resolver
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 3ed3716..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ViewBasedTaglibResolverFactory.java
+++ /dev/null
@@ -1,235 +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.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.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-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
-IStructuredDocumentContextResolverFactory, 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;
-    }
-
-    /**
-     * 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
-    {
-        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");
-            }
-        }
-
-        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());
-            }
-            // shouldn't happen since the constuctor throws an exceptino
-            // if can't get the adapter
-            JSFCorePlugin.log("Unexpected case",
-                    new Throwable(_file.toString()));
-            return null;
-        }
-    }
-
-
-    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/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 2564e31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTPropertyResolver.java
+++ /dev/null
@@ -1,231 +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.JSFAppConfigManager;
-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 JSFAppConfigManager manager = JSFAppConfigManager
-                .getInstance(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));
-                }
-            }
-        }
-        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 e39fe1c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTVariableResolver.java
+++ /dev/null
@@ -1,203 +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.JSFAppConfigManager;
-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 JSFAppConfigManager manager = JSFAppConfigManager
-                .getInstance(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));
-                }
-            }
-        }
-        //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 401c1be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
+++ /dev/null
@@ -1,107 +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))
-        {
-        	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());
-                }
-                    
-                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 5bf9253..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
+++ /dev/null
@@ -1,377 +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.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.core.JavaModelException;
-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);
-                    listener.addListener(new IResourceLifecycleListener()
-                    {
-                        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-                        {
-                            EventResult result = EventResult.getDefaultEventResult();
-
-                            if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                            {
-                                try
-                                {
-                                    final Map<String, BundleFileCacheInfo> bundleCache =
-                                        (Map<String, BundleFileCacheInfo>) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-                                    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);
-            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 b96b8a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java
+++ /dev/null
@@ -1,159 +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.Iterator;
-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.JSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-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 JSFAppConfigManager appconfigMgr = JSFAppConfigManager.getInstance(project);
-           final List resourceBundles = appconfigMgr.getResourceBundles();
-           
-           for (final Iterator it = resourceBundles.iterator(); it.hasNext();)
-           {
-               ResourceBundleType  resBundle = (ResourceBundleType) it.next();
-               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 e40b3c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractDTViewHandler.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.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.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 = "/";
-
-    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");
-        }
-
-        final DTUIViewRoot viewRoot = internalCreateView(facesContext, viewId);
-        
-        if (viewRoot == null)
-        {
-            throw new ViewHandlerException("Problem in createView", Cause.UNABLE_TO_CREATE_VIEW);
-        }
-        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);
-        }
-        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);
-        }
-        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 = "";
-        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("", "", "",""));
-        }
-
-        @Override
-        public IAdaptable getServices()
-        {
-            return new IAdaptable()
-            {
-                public Object getAdapter(Class adapter)
-                {
-                    // no services
-                    return null;
-                }
-            };
-        }
-        
-    }
-
-    /**
-     * 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 589e05f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTComponentIntrospector.java
+++ /dev/null
@@ -1,392 +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.Iterator;
-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.JSFAppConfigManager;
-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)
-    {
-        final ProxyFactoryRegistry registry = getProxyFactoryRegistry(project,
-                contributors);
-
-        if (registry != null)
-        {
-            final IStandardBeanTypeProxyFactory factory = registry
-                    .getBeanTypeProxyFactory();
-            final IBeanTypeProxy classTypeProxy = factory
-                    .getBeanTypeProxy(className);
-            final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(
-                    classTypeProxy);
-
-            String family = null;
-            String renderer = null;
-            try
-            {
-                classTypeWrapper.init();
-                family = classTypeWrapper.callStringMethod("getFamily");
-                renderer = classTypeWrapper.callStringMethod("getRendererType");
-            }
-            catch (ProxyException e1)
-            {
-                // fall through
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                {
-                    JSFCoreTraceOptions.log("DTComponentIntrospector.getComponent:", e1);
-                }
-            }
-
-            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);
-        }
-        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 JSFAppConfigManager manager = JSFAppConfigManager
-                .getInstance(project);
-        final List components = manager.getComponents();
-
-        for (final Iterator it = components.iterator(); it.hasNext();)
-        {
-            final ComponentType component = (ComponentType) it.next();
-            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 JSFAppConfigManager manager = JSFAppConfigManager
-                .getInstance(project);
-        final List converters = manager.getConverters();
-
-        for (final Iterator it = converters.iterator(); it.hasNext();)
-        {
-            final ConverterType converter = (ConverterType) it.next();
-
-            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 JSFAppConfigManager manager = JSFAppConfigManager
-                .getInstance(project);
-        final List converters = manager.getValidators();
-
-        for (final Iterator it = converters.iterator(); it.hasNext();)
-        {
-            final ValidatorType validatorType = (ValidatorType) it.next();
-            
-            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 (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);
-        }
-
-        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: "
-                    + 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 f14121e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTUIViewRoot.java
+++ /dev/null
@@ -1,315 +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 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;
-
-/**
- * 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 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 29a4219..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTUIViewRoot.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.designtime.internal.view;
-
-import java.io.Serializable;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-
-/**
- * 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;
-
-    /**
-     */
-    public DefaultDTUIViewRoot()
-    {
-        // TODO: refactor constants
-        super(null, null, new ComponentTypeInfo("javax.faces.ViewRoot",
-                "javax.faces.component.UIViewRoot", "javax.faces.ViewRoot",
-                null));
-        _defaultServices = new DefaultServices();
-    }
-
-    @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;
-        }
-    }
-}
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 537355a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTViewHandler.java
+++ /dev/null
@@ -1,598 +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.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.StalenessListener;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.VersionStamp;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessEvent.ChangeType;
-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
-            {
-        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");
-            }
-
-            // 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",
-                                viewId));
-            }
-            else
-            {
-                JSFCorePlugin
-                .log(
-                        IStatus.WARNING,
-                        String
-                        .format(
-                                "Could not get view adapter factory toconstruct design time view root for %s",
-                                viewId));
-            }
-        }
-        catch (final ViewHandlerException e)
-        {
-            JSFCorePlugin.log(e, "While acquiring view defn adapter factory");
-            // 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();
-    }
-
-    @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 13d9e29..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");
-            }
-            catch (final CoreException e)
-            {
-                JSFCorePlugin.log(e, "Acquiring model for view root");
-            }
-            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";
-    }
-
-    @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 9139646..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
-                    .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 842f92c..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";
-
-    @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");
-        }
-        throw new IllegalArgumentException(
-                "Only Elements can define view object ids");
-    }
-
-    @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 163cae9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectConstructionStrategy.java
+++ /dev/null
@@ -1,523 +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";
-    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");
-        }
-        _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()))
-                {
-                    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");
-        }
-        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)
-        {
-            // id must be set
-            initMap.put("id", id);
-        }
-
-        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);
-
-            _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 362fc56..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");
-        }
-        else if (viewObject == null)
-        {
-            throw new IllegalArgumentException("viewObject cannot be null");
-        }
-
-        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");
-        }
-
-        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");
-        }
-        
-        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: "
-                                    + viewObject.toString() + " in "
-                                    + file.getFullPath());
-                }
-                catch (IOException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "While finding element for viewObject: "
-                                    + viewObject.toString() + " in "
-                                    + file.getFullPath());
-                }
-                catch (NoElementException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "While finding element for viewObject: "
-                                    + viewObject.toString() + " in "
-                                    + 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 919d54f..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");
-        _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");
-            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 b422bb8..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);
-        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 7a27536..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)
-                && bestComponent.getComponentTypeInfo().isInstanceOf(
-                        ComponentFactory.INTERFACE_VALUEHOLDER))
-        {
-            final String value = attr.getValue();
-
-            if (value != null)
-            {
-                ConverterTypeInfo typeInfo = null;
-
-                if (!value.startsWith("#{"))
-                {
-                    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 e340b4f..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.1 2008/05/12 17:42:19 cbateman 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";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.core/componentMapping.ecore";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "viewMap";
-
-    /**
-     * 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 540a761..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";
-    private final static String                   ELEMENT_NAME = "customViewMapper";
-
-    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");
-                        final Object customHandler = element
-                                .createExecutableExtension("class");
-                        if (customHandler instanceof ICustomViewMapper
-                                && name != null)
-                        {
-                            handlers.put(pluginId + "." + name,
-                                    (ICustomViewMapper) customHandler);
-                        }
-                        else
-                        {
-                            JSFCorePlugin.log(
-                                    "Error loading tag registry extension: "
-                                            + element.getContributor().getName()
-                                            + "." + element.getAttribute("id")
-                                      , new Throwable("No exception: stack trace only"));
-                        }
-                    }
-                    catch (final CoreException e)
-                    {
-                        JSFCorePlugin.log(e,
-                                "Error loading tag registry extension: "
-                                        + element.getContributor().getName()
-                                        + "." + element.getAttribute("id"));
-                    }
-                }
-            }
-        }
-        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 b399158..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        result.append(propertyName);
-        result.append(", elAllowed: ");
-        result.append(elAllowed);
-        result.append(", customConversionFactoryId: ");
-        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 b5607fb..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        result.append(className);
-        result.append(", superClasses: ");
-        result.append(superClasses);
-        result.append(", interfaces: ");
-        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 5cb0817..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.1 2008/05/12 17:42:20 cbateman 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"); 
-            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");
-        }
-    }
-
-    /**
-     * <!-- 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 5d73875..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.1 2008/05/12 17:42:20 cbateman 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);
-        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);
-        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);
-        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);
-
-        EOperation op = addEOperation(tagMappingEClass, null, "findBestMapping", 0, 1, IS_UNIQUE, IS_ORDERED);
-        addEParameter(op, ecorePackage.getEString(), "jsfVersion", 0, 1, IS_UNIQUE, IS_ORDERED);
-        addEParameter(op, ecorePackage.getEString(), "libVersion", 0, 1, IS_UNIQUE, IS_ORDERED);
-
-        initEClass(tagToViewObjectMappingEClass, TagToViewObjectMapping.class, "TagToViewObjectMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-        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);
-
-        initEClass(classTypeInfo_EClass, ClassTypeInfo_.class, "ClassTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-        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);
-
-        initEClass(componentTypeInfo_EClass, ComponentTypeInfo_.class, "ComponentTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-        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);
-
-        initEClass(converterTypeInfo_EClass, ConverterTypeInfo_.class, "ConverterTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-
-        initEClass(validatorTypeInfo_EClass, ValidatorTypeInfo_.class, "ValidatorTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-
-        initEClass(attributeToPropertyMappingEClass, AttributeToPropertyMapping.class, "AttributeToPropertyMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-        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);
-
-        // 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
-          (getTagMapping_VersionedTagToViewMappings(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "versionedTagToViewMappings"
-           });		
-        addAnnotation
-          (getTagMapping_CustomConversionFactoryId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "customConversionFactoryId"
-           });		
-        addAnnotation
-          (getTagMapping_BeanMappedProperties(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "beanMappedProperties"
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_TypeInfo(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "typeInfo"
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_MinJSFVersion(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "minVersion"
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_MinLibraryVersion(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "minLibraryVersion"
-           });		
-        addAnnotation
-          (getClassTypeInfo__ClassName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "className"
-           });		
-        addAnnotation
-          (getClassTypeInfo__SuperClasses(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "superClasses"
-           });		
-        addAnnotation
-          (getClassTypeInfo__Interfaces(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "interfaces"
-           });		
-        addAnnotation
-          (getComponentTypeInfo__ComponentType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "componentType"
-           });		
-        addAnnotation
-          (getComponentTypeInfo__ComponentFamily(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "componentFamily"
-           });		
-        addAnnotation
-          (getComponentTypeInfo__RenderType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "renderType"
-           });		
-        addAnnotation
-          (getConverterTypeInfo__ConverterId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "converterId"
-           });		
-        addAnnotation
-          (getConverterTypeInfo__ForClasses(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "forClass"
-           });		
-        addAnnotation
-          (getValidatorTypeInfo__ValidatorId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "validatorId"
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_PropertyName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "propertyName"
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_ElAllowed(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "elAllowed"
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_CustomConversionFactoryId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element",
-             "name", "customConversionFactoryId"
-           });
-    }
-
-} //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 ceae1a8..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        result.append(componentType);
-        result.append(", componentFamily: ");
-        result.append(componentFamily);
-        result.append(", renderType: ");
-        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 9885320..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        result.append(converterId);
-        result.append(", forClasses: ");
-        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 fedaf67..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        result.append(customConversionFactoryId);
-        result.append(", beanMappedProperties: ");
-        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 dbaaa73..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.1 2008/05/12 17:42:20 cbateman 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";
-
-    /**
-     * 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 = "";
-
-    /**
-     * 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();
-    }
-} //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 bcfcfdb..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.1 2008/05/12 17:42:20 cbateman 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: ");
-        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 edc4118..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");
-            }
-        }
-    }
-
-    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 a994a56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/TagRegistryFactory.java
+++ /dev/null
@@ -1,81 +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";
-
-
-    /**
-     * @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;
-
-    
-    
-    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);
-        }
-        
-    }
-}
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 4a2ab0f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CMNodeNamedMapAdapter.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.designtime.internal.view.model.jsp;
-
-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.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
-{
-    /**
-     * serializable id
-     */
-    private static final long                       serialVersionUID = -4188412823197830484L;
-    private transient final TLDElementDeclaration   _tldElement;
-    private transient final IAttributeAdvisor       _advisor;
-    private transient 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);
-            }
-        }
-        
-        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");
-    }
-
-    public ITagAttributeHandler put(String key, ITagAttributeHandler value)
-    {
-        throw new UnsupportedOperationException("Cannot modify map");
-    }
-
-    public void putAll(Map<? extends String, ? extends ITagAttributeHandler> t)
-    {
-        throw new UnsupportedOperationException("Cannot modify map");
-    }
-
-    public ITagAttributeHandler remove(Object key)
-    {
-        throw new UnsupportedOperationException("Cannot modify map");
-    }
-
-    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.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 bfcf32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CompositeTagResolvingStrategy.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.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;
-
-/**
- * @author cbateman
- * 
- * @param <TLDELEMENT>
- */
-public class CompositeTagResolvingStrategy<TLDELEMENT>
-        extends
-        IteratorPolicyBasedStrategyComposite<TLDELEMENT, ITagElement, String, ITagResolvingStrategy<TLDELEMENT, String>>
-        implements IIdentifiable<String>,
-        ITagResolvingStrategy<TLDELEMENT, String>
-{
-    private static final String ID = "org.eclipse.jst.jsf.designtime.CompositeTagResolvingStrategy";
-
-    /**
-     * @param policy
-     * 
-     */
-    public CompositeTagResolvingStrategy(final IIteratorPolicy<String> policy)
-    {
-        super(policy);
-    }
-
-    public final String getId()
-    {
-        return ID;
-    }
-
-    public final String getDisplayName()
-    {
-        return "Composite Tag Resolving Strategies";
-    }
-
-    @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 a1dfc16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultJSPTagResolver.java
+++ /dev/null
@@ -1,180 +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;
-
-    /**
-     * @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));
-        }
-        else if (elementType instanceof ConverterTypeInfo)
-        {
-            return new TLDConverterTagElement(elementDecl,
-                    (ConverterTypeInfo) elementType, new MetadataAttributeAdvisor(tagId, _loader));
-        }
-        else if (elementType instanceof ValidatorTypeInfo)
-        {
-            return new TLDValidatorTagElement(elementDecl,
-                    (ValidatorTypeInfo) elementType, new MetadataAttributeAdvisor(tagId, _loader));
-        }
-        else if (elementType instanceof TagHandlerType)
-        {
-            return new TLDTagHandlerElement(elementDecl,
-                    (TagHandlerType) elementType, new MetadataAttributeAdvisor(tagId, _loader));
-        }
-        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 989e03b..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",
-                                                                                       "javax.faces.component.UIParameter",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Parameter",
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SELECTITEM            = new ComponentTypeInfo(
-                                                                                       "javax.faces.SelectItem",
-                                                                                       "javax.faces.component.UISelectItem",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.SelectItem",
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SELECTITEMS           = new ComponentTypeInfo(
-                                                                                       "javax.faces.SelectItems",
-                                                                                       "javax.faces.component.UISelectItems",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.SelectItems",
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SUBVIEW               = new ComponentTypeInfo(
-                                                                                       "javax.faces.NamingContainer",
-                                                                                       "javax.faces.component.UINamingContainer",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.NamingContainer",
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_VERBATIM              = new ComponentTypeInfo(
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.component.UIOutput",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.Text");
-
-    private static final ComponentTypeInfo      COMPINFO_VIEW                  = new ComponentTypeInfo(
-                                                                                       "javax.faces.ViewRoot",
-                                                                                       "javax.faces.component.UIViewRoot",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.ViewRoot",
-                                                                                       null);
-
-    // expected type info for jsf/html components
-    private static final ComponentTypeInfo      COMPINFO_COLUMN                = new ComponentTypeInfo(
-                                                                                       "javax.faces.Column",
-                                                                                       "javax.faces.component.UIColumn",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder" },
-                                                                                       "javax.faces.Column",
-                                                                                       null);
-    private static final ComponentTypeInfo      COMPINFO_COMMAND               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlCommandButton",
-                                                                                       "javax.faces.component.html.HtmlCommandButton",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UICommand",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ActionSource",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Command",
-                                                                                       "javax.faces.Button");
-    private static final ComponentTypeInfo      COMPINFO_COMMANDLINK           = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlCommandLink",
-                                                                                       "javax.faces.component.html.HtmlCommandLink",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UICommand",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ActionSource",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Command",
-                                                                                       "javax.faces.Link");
-    private static final ComponentTypeInfo      COMPINFO_DATATABLE             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlDataTable",
-                                                                                       "javax.faces.component.html.HtmlDataTable",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIData",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Data",
-                                                                                       "javax.faces.Table");
-    private static final ComponentTypeInfo      COMPINFO_FORM                  = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlForm",
-                                                                                       "javax.faces.component.html.HtmlForm",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIForm",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Form",
-                                                                                       "javax.faces.Form");
-    private static final ComponentTypeInfo      COMPINFO_GRAPHIC               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlGraphicImage",
-                                                                                       "javax.faces.component.html.HtmlGraphicImage",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIGraphic",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Graphic",
-                                                                                       "javax.faces.Image");
-    private static final ComponentTypeInfo      COMPINFO_HIDDEN                = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputHidden",
-                                                                                       "javax.faces.component.html.HtmlInputHidden",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Input",
-                                                                                       "javax.faces.Hidden");
-    private static final ComponentTypeInfo      COMPINFO_SECRET                = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputSecret",
-                                                                                       "javax.faces.component.html.HtmlInputSecret",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Input",
-                                                                                       "javax.faces.Secret");
-    private static final ComponentTypeInfo      COMPINFO_INPUTTEXT             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputText",
-                                                                                       "javax.faces.component.html.HtmlInputText",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object"                   },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder"                                       },
-                                                                                       "javax.faces.Input",
-                                                                                       "javax.faces.Text");
-    private static final ComponentTypeInfo      COMPINFO_INPUTTEXTAREA         = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputTextarea",
-                                                                                       "javax.faces.component.html.HtmlInputTextarea",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Input",
-                                                                                       "javax.faces.Textarea");
-    private static final ComponentTypeInfo      COMPINFO_MESSAGE               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlMessage",
-                                                                                       "javax.faces.component.html.HtmlMessage",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIMessage",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Message",
-                                                                                       "javax.faces.Message");
-    private static final ComponentTypeInfo      COMPINFO_MESSAGES              = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlMessages",
-                                                                                       "javax.faces.component.html.HtmlMessages",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIMessages",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Messages",
-                                                                                       "javax.faces.Messages");
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTFORMAT          = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputFormat",
-                                                                                       "javax.faces.component.html.HtmlOutputFormat",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.Format");
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTLABEL           = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputLabel",
-                                                                                       "javax.faces.component.html.HtmlOutputLabel",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.Label");
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTLINK            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputLink",
-                                                                                       "javax.faces.component.html.HtmlOutputLink",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.Link");
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTTEXT            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputText",
-                                                                                       "javax.faces.component.html.HtmlOutputText",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.Output",
-                                                                                       "javax.faces.Text");
-    private static final ComponentTypeInfo      COMPINFO_PANELGRID             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlPanelGrid",
-                                                                                       "javax.faces.component.html.HtmlPanelGrid",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIPanel",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Panel",
-                                                                                       "javax.faces.Grid");
-    private static final ComponentTypeInfo      COMPINFO_PANELGROUP            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlPanelGroup",
-                                                                                       "javax.faces.component.html.HtmlPanelGroup",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIPanel",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", },
-                                                                                       "javax.faces.Panel",
-                                                                                       "javax.faces.Group");
-    private static final ComponentTypeInfo      COMPINFO_SELECTBOOLEANCHECKBOX = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectBooleanCheckbox",
-                                                                                       "javax.faces.component.html.HtmlSelectBooleanCheckbox",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectBoolean",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectBoolean",
-                                                                                       "javax.faces.Checkbox");
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYCHECKBOX    = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyCheckbox",
-                                                                                       "javax.faces.component.html.HtmlSelectManyCheckbox",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectMany",
-                                                                                       "javax.faces.Checkbox");
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYLISTBOX     = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyListbox",
-                                                                                       "javax.faces.component.html.HtmlSelectManyListbox",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectMany",
-                                                                                       "javax.faces.Listbox");
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYMENU        = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyMenu",
-                                                                                       "javax.faces.component.html.HtmlSelectManyMenu",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectMany",
-                                                                                       "javax.faces.Menu");
-    private static final ComponentTypeInfo      COMPINFO_SELECTONELISTBOX      = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneListbox",
-                                                                                       "javax.faces.component.html.HtmlSelectOneListbox",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectOne",
-                                                                                       "javax.faces.Listbox");
-    private static final ComponentTypeInfo      COMPINFO_SELECTONEMENU         = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneMenu",
-                                                                                       "javax.faces.component.html.HtmlSelectOneMenu",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectOne",
-                                                                                       "javax.faces.Menu");
-    private static final ComponentTypeInfo      COMPINFO_SELECTONERADIO        = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneRadio",
-                                                                                       "javax.faces.component.html.HtmlSelectOneRadio",
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne",
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput",
-            "javax.faces.component.UIComponentBase",
-            "javax.faces.component.UIComponent", "java.lang.Object",                  },
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder",
-            "javax.faces.component.ValueHolder",
-            "javax.faces.component.StateHolder",                                      },
-                                                                                       "javax.faces.SelectOne",
-                                                                                       "javax.faces.Radio");
-
-    // default converters
-    private static final ConverterTypeInfo      CONVERTERINFO_DATETIME         = new ConverterTypeInfo(
-                                                                                       "javax.faces.convert.DateTimeConverter",
-                                                                                       "javax.faces.DateTime");
-
-    private static final ConverterTypeInfo      CONVERTERINFO_NUMBER           = new ConverterTypeInfo(
-                                                                                       "javax.faces.convert.NumberConverter",
-                                                                                       "javax.faces.Number");
-
-    // default validators
-    private static final ValidatorTypeInfo      VALIDATORINFO_DOUBLERANGE      = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.DoubleRangeValidator",
-                                                                                       "javax.faces.DoubleRange");
-
-    private static final ValidatorTypeInfo      VALIDATORINFO_LENGTH           = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.LengthValidator",
-                                                                                       "javax.faces.Length");
-
-    private static final ValidatorTypeInfo      VALIDATORINFO_LONGRANGE        = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.LongRangeValidator",
-                                                                                       "javax.faces.LongRange");
-
-    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 f473ab3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/IAttributeAdvisor.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.designtime.internal.view.model.jsp;
-
-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;
-
-    /**
-     * @author cbateman
-     *
-     */
-    public static class NullAttributeAdvisor implements IAttributeAdvisor
-    {
-        public ITagAttributeHandler createAttributeHandler(String name)
-                throws UnknownAttributeException
-        {
-            return new TagAttributeHandler(null, name, false);
-        }
-    }
-
-    /**
-     * 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 ad7a0f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/JSPTagResolvingStrategy.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.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();
-}
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 c85ec8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/MetadataAttributeAdvisor.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.designtime.internal.view.model.jsp;
-
-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.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;
-
-/* package */class MetadataAttributeAdvisor implements IAttributeAdvisor
-{
-    private final TagIdentifier      _tagId;
-    private final ViewMetadataLoader _loader;
-
-    public MetadataAttributeAdvisor(final TagIdentifier tagId,
-            final ViewMetadataLoader loader)
-    {
-        _tagId = tagId;
-        _loader = loader;
-    }
-
-    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);
-    }
-}
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 4e081bd..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 : "");
-    }
-}
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 b2721db..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()))
-            {
-                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/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 f7ad766..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagElement.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.designtime.internal.view.model.jsp;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-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"
-                , getName(), getUri(), getTagHandlerClassName())
-                + constructAttributesString();
-    }
-
-    /**
-     * @return a string representation of the attributes.
-     */
-    protected String constructAttributesString()
-    {
-        String attributes = "";
-
-        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", 
-                    name, handler.getCustomHandler(), handler.getName(),
-                    Boolean.valueOf(handler.isELAllowed()));
-        }
-        return attributes;
-    }
-
-    @Override
-    public Map getAttributeHandlers()
-    {
-        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;
-
-        public DocumentElementData(final TLDElementDeclaration tldDoc,
-                final IAttributeAdvisor advisor)
-        {
-            _tldDoc = tldDoc;
-            _adapter = new CMNodeNamedMapAdapter(tldDoc, advisor);
-        }
-
-        @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);
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttributeHandler> getAttributes()
-        {
-            return _adapter;
-        }
-    }
-
-    /**
-     * @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;
-
-        /**
-         * @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)
-        {
-            super();
-            _name = name;
-            _tagHandlerClassName = tagHandlerClassName;
-            _uri = uri;
-            _tagAttributes = tagAttributes;
-        }
-
-        @Override
-        public String getName()
-        {
-            return _name;
-        }
-
-        @Override
-        public String getTagHandlerClassName()
-        {
-            return _tagHandlerClassName;
-        }
-
-        @Override
-        public String getUri()
-        {
-            return _uri;
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttributeHandler> getAttributes()
-        {
-            return _tagAttributes;
-        }
-    }
-
-    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>  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 6608cf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TagIntrospectingStrategy.java
+++ /dev/null
@@ -1,64 +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;
-
-    /**
-     * @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 29accf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/UnresolvedJSPTagResolvingStrategy.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.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";
-    /**
-     * the displayable name
-     */
-    public final static String DISPLAY_NAME = "Unresolved Tag Resolver";
-
-    @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 7baa4a0..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,131 +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.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.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.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
-import org.osgi.framework.Bundle;
-
-class ServletBeanProxyContributor extends ConfigurationContributorAdapter
-{
-    private final IProject   _project;
-    private final JSFVersion _jsfVersion;
-
-    public ServletBeanProxyContributor(final IProject project)
-    {
-        _project = project;
-        _jsfVersion = getProjectVersion(project);
-        if (_jsfVersion == null)
-        {
-            throw new IllegalArgumentException("jsfVersion must not be null");
-        }
-
-    }
-
-    @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);
-        }
-        else
-        {
-            final Bundle coreBundle = JSFCorePlugin.getDefault().getBundle();
-            final IJavaProject javaProject = JavaCore.create(_project);
-            maybeAddJar(controller, "javax.servlet.jsp.tagext.JspIdConsumer",
-                    javaProject, coreBundle, "/jars/fake_jsp_21.jar");
-            maybeAddJar(controller, "javax.el.ELException", javaProject,
-                    coreBundle, "/jars/fake_el.jar");
-        }
-    }
-
-    private void maybeAddJar(
-            final IConfigurationContributionController controller,
-            final String addIfTypeNameNotFound, final IJavaProject javaProject,
-            final Bundle bundle, final String path)
-    {
-        try
-        {
-            final IType type = javaProject.findType(addIfTypeNameNotFound);
-            // if we can't find the type name on the classpath,then inject
-            // our fake jar to aid linkage while introspecting facelet libs
-            if (type == null)
-            {
-
-                controller
-                        .contributeClasspath(
-                                bundle,
-                                path,
-                                IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                                false);
-            }
-        }
-        catch (final JavaModelException jme)
-        {
-            // suppress
-        }
-    }
-
-    static JSFVersion getProjectVersion(final IProject project)
-    {
-        try
-        {
-            if (FacetedProjectFramework.hasProjectFacet(project, "jst.jsf",
-                    "1.0"))
-            {
-                return JSFVersion.V1_0;
-            }
-            else if (FacetedProjectFramework.hasProjectFacet(project,
-                    "jst.jsf", "1.1"))
-            {
-                return JSFVersion.V1_1;
-            }
-            else if (FacetedProjectFramework.hasProjectFacet(project,
-                    "jst.jsf", "1.2"))
-            {
-                return JSFVersion.V1_2;
-            }
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("checking project version", e);
-            // fall-through
-        }
-
-        return null;
-    }
-
-}
\ 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 468907c..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,830 +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";
-    private static final String JAVAX_FACES_WEBAPP_CONVERTER_ELTAG = "javax.faces.webapp.ConverterELTag";
-    private static final String JAVAX_FACES_WEBAPP_VALIDATOR_TAG = "javax.faces.webapp.ValidatorTag";
-    private static final String JAVAX_FACES_WEBAPP_VALIDATOR_ELTAG = "javax.faces.webapp.ValidatorELTag";
-    private static final String JAVAX_FACES_WEBAPP_FACET_TAG = "javax.faces.webapp.FacetTag";
-
-    // 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";
-
-    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");
-        set.add("javax.faces.webapp.UIComponentBodyTag");
-        COMPONENT_TAG_HANDLER_TYPES_JSF11 = Collections.unmodifiableSet(set);
-
-        // JSF 1.2
-        set = new HashSet<String>(8);
-        set.add("javax.faces.webapp.UIComponentTag");
-        set.add("javax.faces.webapp.UIComponentBodyTag");
-        set.add("javax.faces.webapp.UIComponentELTag");
-        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) };
-        final ProxyFactoryRegistry registry = getProxyFactoryRegistry(
-                contributor, project);
-
-        if (registry != null)
-        {
-            final IStandardBeanTypeProxyFactory factory = registry
-                    .getBeanTypeProxyFactory();
-            final IBeanTypeProxy classTypeProxy = factory
-                    .getBeanTypeProxy(className);
-            final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(
-                    classTypeProxy);
-
-            try
-            {
-                classTypeWrapper.init();
-                return classTypeWrapper.callStringMethod("getComponentType");
-            }
-            catch (final ProxyException tp)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                {
-                    JSFCoreTraceOptions.log("TagAnalyzer.findComponentType", tp);
-                }
-            }
-        }
-
-        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.
-        final String className = tldDecl.getTagclass();
-
-        final IConfigurationContributor[] contributor = new IConfigurationContributor[]
-        { new ServletBeanProxyContributor(project) };
-        final ProxyFactoryRegistry 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);
-                }
-                // 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);
-                }
-            }
-            catch (final JavaModelException jme)
-            {
-                // suppress for now
-            }
-        }
-
-        return null;
-    }
-
-    private static String findConverterType_InTag(
-            final IStandardBeanTypeProxyFactory factory,
-            final IBeanTypeProxy classTypeProxy)
-    {
-        final IBeanTypeProxy nullPageContextType = factory
-                .getBeanTypeProxy("javax.servlet.jsp.PageContext");
-        final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(
-                classTypeProxy);
-
-        try
-        {
-            classTypeWrapper.init();
-
-            callSuppressExceptions(classTypeWrapper, "setPageContext",
-                    new IBeanProxy[]
-                    { null }, new IBeanTypeProxy[]
-                    { nullPageContextType });
-            callSuppressExceptions(classTypeWrapper, "doStartTag");
-
-            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");
-
-            if (converterId != null)
-            {
-                return converterId;
-            }
-
-            converterId = getStringField(classTypeWrapper, converterProxy,
-                    "_converterId");
-
-            if (converterId != null)
-            {
-                return converterId;
-            }
-
-            // no? look for a CONVERTER_ID
-            converterId = getStringField(classTypeWrapper, classTypeProxy,
-                    "CONVERTER_ID");
-        }
-        catch (final ProxyException tp)
-        {
-            // fall through
-        }
-        return null;
-    }
-
-    private static String findConverterType_InELTag(
-            final IStandardBeanTypeProxyFactory factory,
-            final IBeanTypeProxy classTypeProxy)
-    {
-        final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(
-                classTypeProxy);
-        final IBeanTypeProxy elExpressionType = factory
-                .getBeanTypeProxy("javax.el.ValueExpression");
-
-        if (elExpressionType == null)
-        {
-            return null;
-        }
-
-        try
-        {
-            classTypeWrapper.init();
-
-            callSuppressExceptions(classTypeWrapper, "doStartTag");
-
-            // no? look for a CONVERTER_ID
-            final IBeanProxy converterId = getFieldInParents(classTypeWrapper,
-                    classTypeProxy, "CONVERTER_ID_EXPR");
-
-            if (converterId != null)
-            {
-                converterId.getTypeProxy().isKindOf(elExpressionType);
-                final BeanProxyWrapper elExprValue = new BeanProxyWrapper(
-                        converterId.getTypeProxy());
-                final String value = elExprValue
-                        .callStringMethod("getExpressionString");
-                System.out.println("Expression string:" + value);
-            }
-
-            //            
-            //
-            // 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) };
-        final ProxyFactoryRegistry registry = getProxyFactoryRegistry(
-                contributor, project);
-
-        if (registry != null)
-        {
-            final IStandardBeanTypeProxyFactory factory = registry
-                    .getBeanTypeProxyFactory();
-            final IBeanTypeProxy classTypeProxy = factory
-                    .getBeanTypeProxy(className);
-            final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(
-                    classTypeProxy);
-            final IBeanTypeProxy converterProxy = factory
-                    .getBeanTypeProxy(JAVAX_FACES_WEBAPP_VALIDATOR_TAG);
-            try
-            {
-                classTypeWrapper.init();
-
-                callSuppressExceptions(classTypeWrapper, "doStartTag");
-                callSuppressExceptions(classTypeWrapper, "createValidator");
-
-                // hopefully doStartTag set the converter field before it
-                // failed.
-                // now try to guess what it's called
-                String validatorId = getStringField(classTypeWrapper,
-                        converterProxy, "validatorId");
-
-                if (validatorId != null)
-                {
-                    return validatorId;
-                }
-
-                validatorId = getStringField(classTypeWrapper, converterProxy,
-                        "_validatorId");
-
-                if (validatorId != null)
-                {
-                    return validatorId;
-                }
-
-                // no? then see if there's a VALIDATOR_ID field *on the tag*
-                validatorId = getStringField(classTypeWrapper, classTypeProxy,
-                        "VALIDATOR_ID");
-
-                if (validatorId != null)
-                {
-                    return validatorId;
-                }
-            }
-            catch (final ProxyException tp)
-            {
-                // fall through
-            }
-        }
-
-        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: "
-                    + 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",
-                                    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)
-            {
-                JSFCorePlugin.log(
-                        "Bad tag class name in " + tldDecl.toString(),
-                        new Throwable());
-                return null;
-            }
-
-            final IType type = javaProject.findType(typeName);
-            
-            if (type == null)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                {
-                    JSFCoreTraceOptions.log("Type not found for: "+typeName);
-                }
-                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));
-            }
-
-            if (tagType == TagType.COMPONENT)
-            {
-                final TLDTagElement element = createComponentTagElement(tldDecl, project);
-                
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-                {
-                    String name = element != null ? element.toString()
-                            : "<none>";
-                    System.out.printf(
-                            "Time to create component tag element %s was %d\n",
-                            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>";
-                    System.out.printf(
-                            "Time to create converter tag element %s was %d\n",
-                            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>";
-                    System.out.printf(
-                            "Time to create validator tag element %s was %d\n",
-                            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>";
-                    System.out.printf(
-                            "Time to create handler tag element %s was %d\n",
-                            name, Long.valueOf(System.nanoTime() - startTime));
-                }
-                return element;
-            }
-        }
-        catch (final JavaModelException jme)
-        {
-            JSFCorePlugin.log(jme, "Trying to get type for TLD");
-        }
-
-        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()))
-            {
-                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()))
-            {
-                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()))
-            {
-                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",
-                                    type.getFullyQualifiedName(), project
-                                            .toString()));
-        }
-
-        Set<String> componentTags = null;
-        Set<String> converterTags = null;
-        Set<String> validatorTags = null;
-
-        final JSFVersion jsfVersion = ServletBeanProxyContributor.getProjectVersion(project);
-
-        // v1.1(9.2.2): JSF component tags must sub-class one of these
-        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)
-        {
-            componentTags = COMPONENT_TAG_HANDLER_TYPES_JSF12;
-            converterTags = CONVERTER_TAG_HANDLER_TYPES_JSF12;
-            validatorTags = VALIDATOR_TAG_HANDLER_TYPES_JSF12;
-        }
-
-        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",
-                    tagType != null ? tagType.toString() : "null"));
-        }
-        return tagType;
-    }
-
-
-}
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 d985699..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=:"
-                    + 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: "
-                        + 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: "
-                                + 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: "
-                        + _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:"
-                                + _storageFile.getAbsolutePath());
-                JSFCoreTraceOptions.log("Initial contents: ");
-                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()));
-
-        for (final ProjectIndex projIndex : _projectIndices)
-        {
-            buffer.append(String.format("\t%s\n", projIndex.toString()));
-        }
-
-        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 "
-                            + project.toString() + " may not be saved");
-        }
-        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");
-            }
-        }
-    }
-
-    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();
-        }
-    }
-
-    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",
-                    _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="
-                    + _relativePath + ", lastModified="
-                    + _lastModStampOnProject + ", saveFile=" + _file;
-        }
-
-        // 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 a1eebbe..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,249 +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);
-
-    /**
-     * @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 df457f8..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";
-    private final static String       MASTER_INDEX_FILE_NAME   = "tagRegistryMasterIndex.idx";
-
-    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: "
-                    + _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: "
-                    + _project.toString());
-            
-            for (final Map.Entry<String, SerializableTLDNamespace> nsEntry : namespaces.entrySet())
-            {
-                JSFCoreTraceOptions.log("\tNamespace: "+nsEntry.getKey());
-                
-                SerializableTLDNamespace ns = nsEntry.getValue();
-                for (final ITagElement element : ns.getViewElements())
-                {
-                    JSFCoreTraceOptions.log("\t\tTag: "+element.toString());
-                }
-            }
-        }
-
-        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: "
-                                    + _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: "
-                                    + masterIndexFile.toString());
-                }
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log("Creating master index file for "
-                            + _project.toString());
-                }
-                index.create(new SerializableVersion(1, 0, 0));
-            }
-            else
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log("Loading master index file for "
-                            + _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: "
-                    + repoDir.getAbsolutePath());
-        }
-
-        if (!repoDir.mkdir())
-        {
-            throw new IOException("Failed to create repo directory: "
-                    + 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 31cfeb0..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);
-        }
-    }
-
-    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 094dff0..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,211 +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.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-
-/**
- * A per-resource singleton manager for TLDTagRegistry's.
- * 
- * @author cbateman
- * 
- */
-public final class TLDRegistryManager extends
-        ResourceSingletonObjectManager<TLDTagRegistry, IProject>
-{
-    // STATIC
-    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");
-                }
-                INSTANCE = new TLDRegistryManager();
-            }
-
-            return INSTANCE;
-        }
-    }
-
-    private TLDRegistryManager()
-    {
-        final ISaveParticipant participant = new MyWorkspaceSaveParticipant();
-        
-        try
-        {
-            ResourcesPlugin.getWorkspace().addSaveParticipant(JSFCorePlugin.getDefault()
-                    , participant);
-        }
-        catch (CoreException e)
-        {
-            JSFCorePlugin.log(e, "TLDRegistryManager failed to install save participant");
-        }
-    }
-
-    @Override
-    protected TLDTagRegistry createNewInstance(final IProject project)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDRegistryManager: creating new instance for "
-                            + project.toString());
-        }
-
-        return new TLDTagRegistry(project);
-    }
-
-    @Override
-    protected void runAfterGetInstance(final IProject resource)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDRegistryManager: Acquired instance for "
-                            + resource.toString());
-        }
-    }
-
-    @Override
-    protected void runBeforeGetInstance(final IProject resource)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions.log("TLDRegistryManager: Getting registry for "
-                    + 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);
-            }
-        }
-
-        public String getDisplayName()
-        {
-            return "JSP Registry Factory";
-        }
-
-    }
-
-    private class MyWorkspaceSaveParticipant implements ISaveParticipant
-    {
-        public void saving(ISaveContext context) throws CoreException
-        {
-            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-            {
-                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saving: Kind="+context.getKind());
-            }
-            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",
-                        moe));
-            }
-        }
-
-        private void saveProject(final IProject project)
-                throws ManagedObjectException
-        {
-            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-            {
-                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saveProject: Project="+project.toString());
-            }
-
-            // 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());
-                }
-
-                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 aa0ed8f5..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,277 +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.List;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
-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.persistence.PersistedDataTagStrategy;
-
-/**
- * Preferences model for the TLD registry
- * 
- * @author cbateman
- * 
- */
-public class TLDRegistryPreferences
-{
-    private final IPreferenceStore             _prefStore;
-
-    private final static String                KEY_STRATEGY_ID_ORDER = "org.eclipse.jst.jsf.designtime.jsp.registry.StrategyIDOrder";
-
-    private final static List<OrderableObject> DEFAULT_STRATEGY_ORDER;
-
-    static
-    {
-        final List<OrderableObject> list = new ArrayList<OrderableObject>();
-        list.add(new OrderableObject(new StrategyIdentifier(PersistedDataTagStrategy.DISPLAY_NAME,
-                PersistedDataTagStrategy.ID), true));
-        list.add(new OrderableObject(new StrategyIdentifier(DefaultJSPTagResolver.DISPLAY_NAME,
-                DefaultJSPTagResolver.ID), true));
-        list.add(new OrderableObject(new StrategyIdentifier(TagIntrospectingStrategy.DISPLAY_NAME,
-                TagIntrospectingStrategy.ID), true));
-        // list.add(UnresolvedJSPTagResolvingStrategy.ID);
-        DEFAULT_STRATEGY_ORDER = Collections.unmodifiableList(list);
-    }
-
-    private List<OrderableObject>              _ids;
-    private List<OrderableObject>              _originalIds;
-
-    /**
-     * Constructor
-     * 
-     * @param prefStore
-     */
-    public TLDRegistryPreferences(final IPreferenceStore prefStore)
-    {
-        _prefStore = prefStore;
-        _ids = new ArrayList<OrderableObject>();
-    }
-
-    /**
-     * 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(strategyId.getDisplayName());
-            buffer.append(",");
-            buffer.append(strategyId.getId());
-            buffer.append(",");
-            buffer.append(id.isEnabled());
-            buffer.append(",");
-        }
-        return buffer.toString();
-    }
-
-    private List<OrderableObject> deserialize(final String serializedList)
-    {
-        final List<OrderableObject> list = new ArrayList<OrderableObject>();
-        final String[] ids = serializedList.split(",");
-        if ((ids.length % 3) != 0)
-        {
-            return new ArrayList<OrderableObject>();
-        }
-
-        for (int i = 0; i < ids.length; i += 3)
-        {
-            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))
-            {
-                id = DefaultJSPTagResolver.ID;
-            }
-
-            final StrategyIdentifier strategyIdentifier = new StrategyIdentifier(
-                    displayName, id);
-            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()));
-    }
-
-    /**
-     * 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 String _id;
-        private final String _displayName;
-
-        StrategyIdentifier(final String displayName, final String id)
-        {
-            _displayName = displayName;
-            _id = id;
-        }
-
-        /**
-         * @return the id
-         */
-        public String getId()
-        {
-            return _id;
-        }
-
-        /**
-         * @return the display name for the strategy
-         */
-        public String getDisplayName()
-        {
-            return _displayName;
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj instanceof StrategyIdentifier)
-            {
-                return _id.equals(((StrategyIdentifier)obj)._id);
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return _id.hashCode();
-        }
-    }
-
-    private class MyOrderedListProvider extends OrderedListProvider
-    {
-        @Override
-        protected List<OrderableObject> createAndPopulateOrderedObjects()
-        {
-            return _ids;
-        }
-    }
-
-}
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 e96d3f2..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,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.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.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 TLDRegistryPreferences                                     _prefs;
-
-    TLDTagRegistry(final IProject project)
-    {
-        _project = project;
-        _nsResolved = new HashMap<String, TLDNamespace>();
-
-        _prefs = new TLDRegistryPreferences(JSFCorePlugin.getDefault().getPreferenceStore());
-        _prefs.load();
-        final IdentifierOrderedIteratorPolicy<String> policy =
-            getTagResolvingPolicy();
-        // 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<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);
-        return  policy;
-    }
-
-    protected final void doDispose()
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry: Disposing for project "
-                    + _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 "
-                            + _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");
-        }
-        catch (ClassNotFoundException e)
-        {
-            JSFCorePlugin.log(e, "Checkpointing JSP tags failed");
-        }
-    }
-
-    @Override
-    protected Job getRefreshJob(final boolean flushCaches)
-    {
-        return new Job("Refreshing JSP tag registry for " + _project.getName())
-        {
-            @Override
-            protected IStatus run(final IProgressMonitor monitor)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                {
-                    JSFCoreTraceOptions.log("TLDTagRegistry.refresh: start");
-                }
-
-                synchronized (TLDTagRegistry.this)
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                    {
-                        JSFCoreTraceOptions
-                                .log("TLDTagRegistry.refresh: start");
-                    }
-
-                    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");
-                    }
-                    return Status.OK_STATUS;
-                }
-            }
-        };
-    }
-
-    /**
-     */
-    private void initialize(boolean fireEvent)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry.initialize: start");
-        }
-
-        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 "
-                                + _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");
-        }
-    }
-
-    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());
-            }
-            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",
-                            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());
-            }
-
-        }
-        // 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");
-        }
-        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));
-        }
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDTagRegistry.getAllTagLibraries: finished");
-        }
-        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="
-                    + uri);
-        }
-
-        if (!_hasBeenInitialized)
-        {
-            initialize(false);
-        }
-
-        final Namespace ns = _nsResolved.get(uri);
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDTagRegistry.getTagLibrary: finished, result="
-                            + ns.toString());
-        }
-        return ns;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String
-                .format(
-                        "TLDRegistry for project %s, isDisposed=%s, hasBeenInitialized=%s, numberOfNamespace=%d",
-                        _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("Update job for project " + 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",
-                        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;
-            }
-        }
-    }
-}
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 0c075af..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");
-        }
-
-        visitDelta(delta);
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-        {
-            JSFCoreTraceOptions.log("TagIndexListener.indexChanged: finish");
-        }
-    }
-
-    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
-                                        .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",
-                                                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",
-                                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 200b144..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/CachingSymbolContextResolver.java
+++ /dev/null
@@ -1,214 +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 IMethodSymbol METHOD_SYMBOL_NOT_FOUND =
-        SymbolFactory.eINSTANCE.createIMethodSymbol();
-    
-    private final SymbolContextResolver     _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);
-    }
-
-    @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 == 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 == SYMBOL_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, SYMBOL_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 69fc6be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-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[0]);
-        }
-        
-        return INSTANCE;
-    }
-    
-    private StructuredDocumentSymbolResolverFactory(Class[] supportedDelegateTypes) 
-    {
-        super(supportedDelegateTypes);
-    }
-
-    /**
-     * @param context
-     * @return a new instance of symbol resolver for context
-     */
-    public ISymbolContextResolver getSymbolContextResolver(IModelContext context) {
-        ISymbolContextResolver  resolver = internalGetSymbolContextResolver(context);
-        
-        if (resolver == null)
-        {
-            resolver = delegateGetSymbolContextResolver(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)
-    {
-        // no delegates currently supported
-        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/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 b2f89c3..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"));
-        }
-
-        // 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"));
-    }
-
-    /**
-     * @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 f8e7f1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
+++ /dev/null
@@ -1,238 +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.JSFAppConfigManager;
-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 JSFAppConfigManager  configManager = JSFAppConfigManager.getInstance(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() : "";
-                        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(); //$NON-NLS-1$
-        if (beanName != null)
-        {
-            additionalInfo.append("<p><b>"+Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Name")); //$NON-NLS-1$
-            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$
-            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$
-            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 7583a7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java
+++ /dev/null
@@ -1,313 +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.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.IDTExternalContext;
-
-/**
- * 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;
-    
-    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);
-        }
-
-        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());
-        }
-        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());
-        }
-
-        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);
-        
-        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);
-        
-        return Collections.unmodifiableMap(symbols);
-    }
-
-    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));
-            }
-
-            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 2ef108d..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); //$NON-NLS-1$
-        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");
-    }
-
-    /**
-     * 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");
-    }
-
-//    /  /**
-//  * @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 0b3f157..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";
-
-	/**
-	 * @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;
-		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 71809e8..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();
-		if (!(tagAttrEntity.eContainer() instanceof Entity))
-		{
-		    throw new IllegalArgumentException("tagAttrEntity must be contained in a tag Entity to use this constructor");
-		}
-		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 93d93b8..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";	
-	
-	/**
-	 * @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 4d43d87..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";	
-	/**
-	 * 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";	
-	/**
-	 * 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";	
-	/**
-	 * @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 25baa40..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";
-	
-	/**
-	 * Trait name for valid-values-code
-	 */
-	public static final String VALID_VALUES_CODE_PROP_NAME = VALID_VALUES_PROP_NAME + "-code";
-	/**
-	 * Trait name for valid-values-severity
-	 */
-	public static final String VALID_VALUES_SEVERITY_PROP_NAME = VALID_VALUES_PROP_NAME + "-severity";
-	/**
-	 * Trait name for valid-values-message
-	 */
-	public static final String VALID_VALUES_MESSAGE_PROP_NAME = VALID_VALUES_PROP_NAME + "-message";
-	/**
-	 * Trait name for valid-maximum
-	 */
-	public static final String VALID_VALUES_MAX_PROP_NAME = "valid-maximum";
-	/**
-	 * Trait name for valid-minimum
-	 */
-	public static final String VALID_VALUES_MIN_PROP_NAME = "valid-minimum";
-	/**
-	 * @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 0ae2de2..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;
-		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 6e2d1f4..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);
-				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());
-			}
-		} catch (ClassNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + type.getBundleID() +" for " + type.getTypeID());
-		}
-		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());
-		} catch (IllegalAccessException e) {
-			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + type.getBundleID() +" for " + type.getTypeID());
-		}
-		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 5c4b0b2..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());
-		}
-	}
-	
-	/**
-	 * 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");
-					String klass = ext.getConfigurationElements()[j].getAttribute("class");
-					final String runtimeType = ext.getConfigurationElements()[j].getAttribute("runtime-type");
-					if (klass == null || klass.trim().equals("")){
-						klass = getDefaultClassName();
-					}
-					registerType(bundleId, id, klass, runtimeType);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + ext_pt_id + " registry");
-		}
-	}
-	
-	/**
-	 * @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 9deab17..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";
-	private static final String DEFAULT_CLASS = "org.eclipse.jst.jsf.metadataprocessors.DefaultTypeDescriptor";
-	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 9cb0303..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);
-					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());
-			} 
-			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;
-	}
-
-}
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 17b5a41..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";
-	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");
-					final String klass = ext.getConfigurationElements()[j].getAttribute("class");
-					registerFeature(bundleId, id, klass);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + EXTPTID + " registry");
-		}
-	}
-	
-	/**
-	 * 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 1c25080..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.2 2008/03/30 21:22:24 cbateman 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";
-	/**
-	 * the display label name
-	 */
-	public static final String TRAIT_DISPLAY_LABEL 	= "display-label";
-	/**
-	 * the trait description name
-	 */
-	public static final String TRAIT_DESCRIPTION 	= "description";
-	/**
-	 * the expert trait
-	 */
-	public static final String TRAIT_IS_EXPERT 		= "expert";
-	/**
-	 * the hiddent trait
-	 */
-	public static final String TRAIT_IS_HIDDEN 		= "hidden";
-	/**
-	 * the small icon trait
-	 */
-	public static final String TRAIT_SMALL_ICON 	= "small-icon";
-	/**
-	 * the large icon trait
-	 */
-	public static final String TRAIT_LARGE_ICON 	= "large-icon";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * 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 a6f2ba4..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.2 2008/03/30 21:22:24 cbateman 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";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * 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 2929af3..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * 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 377ff43..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "paletteinfos";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "pi";
-
-	/**
-	 * 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 d84b1ad..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * 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 fb3b937..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.1 2008/03/25 19:31:30 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";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * 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 c06f5d8..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * 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 1d0717b..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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);
-				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");
-		}
-		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");
-			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");
-			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: ");
-		result.append(id);
-		result.append(", tag: ");
-		result.append(tag);
-		result.append(", displayLabel: ");
-		result.append(displayLabel);
-		result.append(", description: ");
-		result.append(description);
-		result.append(", expert: ");
-		result.append(expert);
-		result.append(", hidden: ");
-		result.append(hidden);
-		result.append(", smallIcon: ");
-		result.append(smallIcon);
-		result.append(", largeIcon: ");
-		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 9d68ced..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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"); 
-			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");
-		}
-	}
-
-	/**
-	 * <!-- 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 0b1e219..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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 7abbfbb..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * <!-- 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);
-		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);
-
-		EOperation op = addEOperation(paletteInfosEClass, this.getPaletteInfo(), "findPaletteInfoById", 0, 1);
-		addEParameter(op, ecorePackage.getEString(), "id", 1, 1);
-
-		initEClass(paletteInfoEClass, PaletteInfo.class, "PaletteInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-		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);
-		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);
-		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);
-		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);
-		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);
-		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);
-		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);
-
-		addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isExpert", 0, 1);
-
-		addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isHidden", 0, 1);
-
-		initEClass(tagCreationInfoEClass, TagCreationInfo.class, "TagCreationInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-
-		initEClass(tagCreationTemplateEClass, TagCreationTemplate.class, "TagCreationTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-
-		initEClass(tagCreationAttributeEClass, TagCreationAttribute.class, "TagCreationAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		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);
-		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);
-
-		// 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
-		  (getPaletteInfos_Infos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "item"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_DisplayLabel(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-label"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Expert(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Hidden(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_TagCreation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-create"
-		   });		
-		addAnnotation
-		  (getTagCreationInfo_Attributes(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute"
-		   });
-	}
-
-} //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 4109b42..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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: ");
-		result.append(id);
-		result.append(", value: ");
-		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 327f928..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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: ");
-		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 edad1eb..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.1 2008/03/25 19:31:28 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";
-
-	/**
-	 * 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 020473a..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * 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 1059181..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.1 2008/03/25 19:31:30 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";
-
-	/**
-	 * 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 d072810..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java
+++ /dev/null
@@ -1,182 +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.JSFAppConfigManager;
-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 (JSFAppConfigManager.getInstance(wr.getProject()) == null) 
-			return true;
-			
-		IFile jsp = (IFile)wr.getResource();
-		List rules = JSFAppConfigManager.getInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-		for(Iterator it=rules.iterator();it.hasNext();){
-			NavigationRuleType rule = (NavigationRuleType)it.next();
-			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() {
-		List ret = new ArrayList();
-		if (getStructuredDocumentContext() == null)
-			return ret;
-		
-		IWorkspaceContextResolver wr = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (wr != null && JSFAppConfigManager.getInstance(wr.getProject()) != null) {//may not be JSF faceted project or know faces-config){			
-			IFile jsp = (IFile)wr.getResource();
-			List rules = JSFAppConfigManager.getInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-			for(Iterator it=rules.iterator();it.hasNext();){
-				NavigationRuleType rule = (NavigationRuleType)it.next();
-				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 57a0625..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");
-					}
-				}
-				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 5d06105..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$ //$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$
-	};
-
-	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 cb04fde..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$
-	}
-
-	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 4c07e0e..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());
-        }
-
-		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 b96918d..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";
-    private final static boolean DEFAULT_ENABLE_BUILD_VALIDATION = true;
-
-    private final static String KEY_ENABLE_INCREMENTAL_VALIDATION = 
-        "org.eclipse.jst.jsf.ui.ValidateJSFELIncremental";
-    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));
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(context.getNode("org.eclipse.jst.jsf.ui").getBoolean(key, false));
-        }
-        else
-        {
-            try
-            {
-                return context.getNode("org.eclipse.jst.jsf.core").get(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) 
-    {
-        // 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))
-        {
-            return Diagnostic.ERROR;
-        }
-        else if ("warning".equals(severity))
-        {
-            return Diagnostic.WARNING;
-        }
-        else if ("ignore".equals(severity))
-        {
-            return Diagnostic.OK;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid enum name: "+severity);
-        }
-    }
-    
-    /**
-     * @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.WARNING;
-            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");
-        }
-    }
-
-    /**
-     * @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");
-        }
-    }
-    
-    /**
-     * @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);
-        }
-    }
-    
-    /**
-     * 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;
-    }
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_BOTH_OPERANDS_NULL = 
-        createQualifiedKeyName("BINARY_OP_BOTH_OPERANDS_NULL");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        createQualifiedKeyName("BINARY_OP_POSSIBLE_DIVISION_BY_ZERO");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        createQualifiedKeyName("BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS");
-    /**
-     * 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");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        createQualifiedKeyName("BINARY_OP_NO_AVAILABLE_TYPE_COERCION");
-    /**
-     * 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");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        createQualifiedKeyName("UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * 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");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-        createQualifiedKeyName("TERNARY_OP_CHOICE_IS_ALWAYS_SAME");
-    /**
-     * 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"); 
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        createQualifiedKeyName("UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        createQualifiedKeyName("CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_NOT_FOUND = 
-        createQualifiedKeyName("MEMBER_NOT_FOUND");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String VARIABLE_NOT_FOUND = 
-        createQualifiedKeyName("VARIABLE_NOT_FOUND");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MISSING_CLOSING_EXPR_BRACKET = 
-        createQualifiedKeyName("MISSING_CLOSING_EXPR_BRACKET");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String GENERAL_SYNTAX_ERROR = 
-        createQualifiedKeyName("GENERAL_SYNTAX_ERROR");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String EMPTY_EL_EXPRESSION = 
-        createQualifiedKeyName("EMPTY_EL_EXPRESSION");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        createQualifiedKeyName("BINARY_OP_DOT_WITH_VALUEB_NULL");
-    /**
-     * 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");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        createQualifiedKeyName("POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        createQualifiedKeyName("BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        createQualifiedKeyName("BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE");
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_IS_INTERMEDIATE =
-        createQualifiedKeyName("MEMBER_IS_INTERMEDIATE");
-}
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 9a6a537..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(
-                    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))
-        {
-            return Diagnostic.ERROR;
-        }
-        else if ("warning".equals(severity))
-        {
-            return Diagnostic.WARNING;
-        }
-        else if ("ignore".equals(severity))
-        {
-            return Diagnostic.OK;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid enum name: " + severity);
-        }
-    }
-
-    /**
-     * @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: "
-                        + diagnosticId + " is out of range");
-        }
-    }
-
-    /**
-     * @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);
-        }
-    }
-
-    /**
-     * 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;
-    }
-
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String INCOMPATIBLE_METHOD_TYPES  = createQualifiedKeyName("INCOMPATIBLE_METHOD_TYPES");
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String INCOMPATIBLE_TYPES         = createQualifiedKeyName("INCOMPATIBLE_TYPES");
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String METHOD_EXPRESSION_EXPECTED = createQualifiedKeyName("METHOD_EXPRESSION_EXPECTED");
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String PROPERTY_NOT_READABLE      = createQualifiedKeyName("PROPERTY_NOT_READABLE");
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String PROPERTY_NOT_WRITABLE      = createQualifiedKeyName("PROPERTY_NOT_WRITABLE");
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String VALUE_EXPRESSION_EXPECTED  = createQualifiedKeyName("VALUE_EXPRESSION_EXPECTED");
-}
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 06265b0..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";
-        }
-    }
-    ,
-    /**
-     * Indicates a problem severity of Warning
-     */
-    WARNING
-    {
-        public java.lang.String toString() {
-            return "warning";
-        }
-    }
-    , 
-    /**
-     * Indicates no problem should be shown
-     */
-    IGNORE
-    {
-        public java.lang.String toString() {
-            return "ignore";
-        }
-    };
-    
-    /**
-     * @param value
-     * @return the enum based on the toString mappings
-     */
-    public static Severity valueOfString(String value)
-    {
-        if ("error".equals(value))
-        {
-            return ERROR;
-        }
-        else if ("warning".equals(value))
-        {
-            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 d61f4c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.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.validation.internal;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @author cbateman
- *
- */
-public class ValidationPreferences 
-{
-    private final IPreferenceStore                      _prefStore;
-    private final ELValidationPreferences               _elPrefs;
-    private final JSFTypeComparatorPreferences          _typeComparatorPrefs;
-    /**
-     * Constructor
-     * @param prefStore 
-     */
-    public ValidationPreferences(IPreferenceStore  prefStore)
-    {
-        _prefStore = prefStore;
-        _elPrefs = new ELValidationPreferences();
-        _typeComparatorPrefs = new JSFTypeComparatorPreferences();
-    }
-
-    /**
-     * @return the el preferences
-     */
-    public ELValidationPreferences getElPrefs() 
-    {
-        return _elPrefs;
-    }
-
-    /**
-     * @return the type comparator preferences.
-     */
-    public JSFTypeComparatorPreferences getTypeComparatorPrefs()
-    {
-        return _typeComparatorPrefs;
-    }
-
-    /**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);
-    }
-
-    /**
-     * Commits but does not store the preferences
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        _elPrefs.commit(prefStore);
-        _typeComparatorPrefs.commit(prefStore);
-    }
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-        _elPrefs.setDefaults();
-        _typeComparatorPrefs.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 da1f97d..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");
-        }
-
-        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);
-        }
-        catch (final IOException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-        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 76da0f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java
+++ /dev/null
@@ -1,471 +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.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.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
-     * @return an error message if scope does not match a valid
-     * scope enum.
-     */
-    public static IMessage validateManagedBeanScope(ManagedBeanScopeType scope)
-    {
-        // 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$
-        {
-            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 6f51617..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java
+++ /dev/null
@@ -1,390 +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.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.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.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;
-
-        try
-        {
-            final IPath path = JSFAppConfigUtils.getWebContentFolderRelativePath(file);
-            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()))
-                {
-                    final NamedNodeMap map = node.getAttributes();
-                    // the most accurate thing is the version
-                    final Node versionAttrib = map.getNamedItem("version");
-
-                    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);
-
-        for (final Iterator it = messages.iterator(); it.hasNext();)
-        {
-            final IMessage message = (IMessage) it.next();
-            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");
-            // fall-through and return null
-        }
-        return null;
-    }
-
-    private String extractVersionFromPublicId(final DocumentType docType)
-    {
-        final String publicId = docType.getPublicId();
-        final String publicIdRegex = "-\\/\\/(.*)\\/\\/(.*)\\/\\/.*";
-
-        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+");
-
-                // verify that the class type is a DTD
-                if (classTypes.length > 0
-                        && "DTD".equals(classTypes[0]))
-                {
-                    // 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";
-        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))
-                {
-                    return version.replaceAll("_", ".");
-                }
-            }
-        }
-        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 1dc04c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java
+++ /dev/null
@@ -1,299 +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())
-        };
-    }
-    
-    /**
-     * @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);
-        }
-    }
-    
-    private static class NavigationHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        /**
-         * @param version 
-         */
-        public NavigationHandlerValidationVisitor(final String version) {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler(),
-                    version,"javax.faces.application.NavigationHandler", true);
-        }
-    }
-    
-    private static class ViewHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        ViewHandlerValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler(),
-                    version,"javax.faces.application.ViewHandler", true);
-        }
-    }
-    
-    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);
-        }    
-    }
-    
-    private static class PropertyResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        PropertyResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver(),
-                    version,"javax.faces.el.PropertyResolver", true);
-        }
-
-        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")
-                        , object, file);
-            }
-        }
-    }
-
-    private static class VariableResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        VariableResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver(),
-                    version, "javax.faces.el.VariableResolver", true);
-        }
-
-        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")
-                        , 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);
-        }
-
-        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")
-                        , 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");
-            
-            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;
-        }
-    }
-
-}
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/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 6ef8fa3..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;
-        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/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 5ec0f3e..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";
-        }
-
-        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()))
-                {
-                    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")
-                            , 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 60ac2eb..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";
-        }
-
-        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 a3b7909..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java
+++ /dev/null
@@ -1,165 +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.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;
-    }
-    
-    /**
-     * @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 66c2c28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java
+++ /dev/null
@@ -1,102 +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())
-        };
-    }
-
-    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";
-            }
-
-            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 7ea5374..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java
+++ /dev/null
@@ -1,170 +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.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-/**
- * @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())
-        };
-    }
-
-    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";
-        }
-
-        @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";
-        }
-
-        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";
-        }
-
-        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";
-        }
-
-        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 4f4d47c..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)
-                    , 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
-                            , 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())
-                    || "".equals(propertyClass.trim()))
-            {
-                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 27dd66c..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())
-                || "".equals(propertyClass.trim()))
-        {
-            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 fb62b62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java
+++ /dev/null
@@ -1,110 +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;
-}
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 f58804d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
+++ /dev/null
@@ -1,101 +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.PropertyNameType;
-
-/**
- * Validate the validation property name
- * 
- * @author cbateman
- */
-class PropertyNameValidationVisitor extends EObjectValidationVisitor
-{
-    private final EStructuralFeature   _parentClassNameFeature;
-    
-    /**
-     * @param feature 
-     * @param parentClassNameFeature 
-     * @param version
-     */
-    public PropertyNameValidationVisitor(EStructuralFeature feature,
-            EStructuralFeature parentClassNameFeature, String version)
-    {
-        super(feature, version);
-        _parentClassNameFeature = parentClassNameFeature;
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return PropertyValidationVisitor.NO_CHILDREN;
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        final String parentClassType = getParentClassType(object);
-        
-        if (parentClassType != null)
-        {
-            String typeSig = 
-                PropertyValidationVisitor.validateProperty((PropertyNameType)object
-                        , file.getProject(), parentClassType);
-            final String propertyName = 
-                ((PropertyNameType)object).getTextContent();
-            
-            if (typeSig == null)
-            {
-                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");
-                    
-                    if (feature != null)
-                    {
-                        parentClassType = (String) 
-                            parentClassTypeObject.eGet(feature);
-                    }
-                }
-            }
-        }
-        
-        return parentClassType;
-    }
-}
\ 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 be9f5ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.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.jsf.validation.internal.appconfig;
-
-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.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * 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())
-        };
-    }
-
-    static String validateProperty(PropertyNameType object, IProject project, String parentClassType)
-    {
-        String signatureBeanProperty = null;
-        try
-        {
-           IJavaProject javaProject = JavaCore.create(project);
-           IType type = javaProject.findType(parentClassType);
-           
-           if (type != null)
-           {
-               final JDTBeanIntrospector introspector =
-                   new JDTBeanIntrospector(type);
-               
-               final Map properties = introspector.getProperties();
-
-               final String propertyName = object.getTextContent(); 
-               if (properties.containsKey(propertyName))
-               {
-                   final JDTBeanProperty beanProperty = 
-                       (JDTBeanProperty) properties.get(propertyName);
-                   signatureBeanProperty = 
-                       beanProperty.getTypeSignature();
-               }
-           }
-        }
-        catch(JavaModelException jme)
-        {
-            JSFCorePlugin
-                .log(new Exception(jme), 
-                     "Problem validating on parent: "+parentClassType);
-        }
-
-        return signatureBeanProperty;
-    }
-}
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 a7b474b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.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.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())
-        };
-    }
-
-    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";
-        }
-
-        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 d92fabd..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";
-        }
-
-        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 512e3c7..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";
-        }
-
-        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 37da684..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.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
-###############################################################################
-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
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 5e140ea..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.4 2008/02/01 21:52:24 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";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.core/constraints.ecore";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "cnst";
-
-    /**
-     * 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 f83091d..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.2 2007/03/22 23:56:16 cbateman 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"); 
-            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");
-        }
-    }
-
-    /**
-     * <!-- 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 fc60ec7..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.3 2007/04/16 19:53:19 itrimble 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);
-        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);
-        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);
-
-        initEClass(tagSetEClass, TagSet.class, "TagSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-
-        initEClass(containsTagConstraintEClass, ContainsTagConstraint.class, "ContainsTagConstraint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        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);
-        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);
-
-        // 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
-          (getTagId_Uri(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "uri"
-           });		
-        addAnnotation
-          (getTagId_Name(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "name"
-           });		
-        addAnnotation
-          (getTagSet_Tags(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "tagId"
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SetGenerator(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "set-generator"
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SatisfiesSet(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "satisfies-set"
-           });
-    }
-
-} //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 a4f9985..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.1 2007/02/28 21:16:02 cbateman 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: ");
-        result.append(uri);
-        result.append(", name: ");
-        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 e8b2ba9..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");
-        }
-
-        // 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");
-        }
-
-        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"));
-        }
-
-        ((EvaluationTracker)data).setType(type);
-        return data;
-    }
-
-    private String stripQuotes(final String stringLiteral)
-    {
-        if (stringLiteral.startsWith("'")
-                || stringLiteral.startsWith("\""))
-
-        {
-            if (stringLiteral.length() > 2)
-            {
-                // take 'literal' -> literal
-                return stringLiteral.substring(1, stringLiteral.length()-1);
-            }
-            // if only two characters, then the empty string
-            return "";
-        }
-
-        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);
-
-                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);
-
-                    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");
-        }
-        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");
-        }
-
-        // 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 = "";
-        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("");
-
-                elText = "";
-            }
-            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 e1975f0..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";
-
-    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 2ce58ce..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";
-    }
-
-    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 4cfc74e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java
+++ /dev/null
@@ -1,165 +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.el.AbstractDTPropertyResolver;
-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";
-
-    /**
-     * @param diagnosticFactory 
-     * @param file 
-     */
-    public BracketOperator(final DiagnosticFactory diagnosticFactory, final IFile file)
-    {
-        super(file, diagnosticFactory);
-    }
-
-	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");
-    }    
-}
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 b1d3059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,261 +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";
-
-    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) {
-        // 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 72720ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java
+++ /dev/null
@@ -1,70 +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.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
-     */
-    public DotOperator(final DiagnosticFactory diagnosticFactory, final IFile file) 
-    {
-        super(file, diagnosticFactory);
-    }
-
-	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");
-    }
-}
\ 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 812d1cb..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";
-
-    EmptyUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType type) 
-    {
-        if (type instanceof StringLiteralType)
-        {
-            if ("".equals(((StringLiteralType)type).getLiteralValue()))
-            {
-                // 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()))
-            {
-                condition = "true";
-            }
-            else
-            {
-                condition = "false";
-            }
-
-            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");
-        }
-        
-        // 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 dcefc2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
+++ /dev/null
@@ -1,540 +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) {
-        
-        // 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 41b897f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java
+++ /dev/null
@@ -1,178 +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");
-            }
-        }
-    
-        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");
-            }
-        }
-
-        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) 
-    {
-        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");
-            //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");
-
-            //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");
-            }
-        }
-        
-        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");
-            }
-        }
-           
-        // 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 e4695ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.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.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) 
-    {
-        // 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 505a125..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.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.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.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-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;
-
-    // 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
-     */
-    protected MemberAccessorOperator(final IFile file,
-            final DiagnosticFactory diagnosticFactory)
-    {
-        _file = file;
-        _diagnosticFactory = diagnosticFactory;
-    }
-
-    /**
-     * @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 (!(firstArg instanceof IObjectSymbolBasedValueType))
-        {
-            throw new AssertionError(
-            "The first argument of the member operator must always be a symbol resolvable value type");
-        }
-
-        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)
-    {
-        final AbstractDTPropertyResolver resolver = getPropertyResolver();
-
-        if (resolver != null)
-        {
-            return resolver.getProperty(symbol, name);
-        }
-
-        JSFCorePlugin.log("Error acquiring property resolver", new Throwable());
-        return null;
-    }
-
-    /**
-     * @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)
-    {
-        final AbstractDTMethodResolver resolver = getMethodResolver();
-
-        if (resolver != null)
-        {
-            return resolver.getMethod(symbol, name);
-        }
-
-        JSFCorePlugin.log("Error acquiring property resolver", new Throwable());
-        return null;
-
-    }
-
-    /**
-     * @return the property resolver for the current source file
-     */
-    protected final AbstractDTPropertyResolver getPropertyResolver()
-    {
-        final DesignTimeApplicationManager manager =
-            DesignTimeApplicationManager.getInstance(_file.getProject());
-
-        if (manager != null)
-        {
-            return manager.getPropertyResolver();
-        }
-
-        return null;
-    }
-
-    /**
-     * @return the method resolver for the current source file
-     */
-    protected final AbstractDTMethodResolver getMethodResolver()
-    {
-        final DesignTimeApplicationManager manager =
-            DesignTimeApplicationManager.getInstance(_file.getProject());
-
-        if (manager != null)
-        {
-            return manager.getMethodResolver();
-        }
-        return null;
-    }
-
-    /**
-     * @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 7dcdc3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java
+++ /dev/null
@@ -1,212 +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";
-
-    MinusUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public Diagnostic validate(ValueType type)
-    {
-        // 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 ba4765b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,383 +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";
-
-    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) {
-        // 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 7076622..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";
-
-
-    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 5bdc163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,300 +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) 
-    {
-        // 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");
-                    }
-                    
-                    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");
-                    }
-                    
-                    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 dd1d5db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java
+++ /dev/null
@@ -1,102 +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)
-    {
-        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"
-                                 , Boolean.valueOf(!coercedValue.booleanValue()).toString()); 
-                        
-                }
-                catch (TypeCoercionException tce)
-                {
-                    throw new AssertionError("coerce should not throw exception");
-                }
-            }
-            
-            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");
-                }
-            }
-            
-            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 33bd4be..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";
-    }
-
-    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 2879cec..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";
-
-    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 c50d8ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java
+++ /dev/null
@@ -1,138 +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.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)
-    {
-        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";
-                        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 d6a0759..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");
-        }
-        
-        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/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 a42828c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/AttributeValidatingStrategy.java
+++ /dev/null
@@ -1,683 +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.jface.preference.IPreferenceStore;
-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.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.JSFAppConfigManager;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService;
-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.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$
-    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"
-                    , 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;
-                        }
-                    }
-                }
-            }
-            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)
-        {
-            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()
-    {
-        String res = System.getProperty(DISABLE_ALTERATIVE_TYPES_KEY);
-        if (res == null) {
-            //check env var also
-            res = System.getenv(DISABLE_ALTERATIVE_TYPES_KEY);
-        }
-        if (res != null)
-        {
-            return true;
-        }
-        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
-        return prefStore.getBoolean("org.eclipse.jst.jsf.core."+DISABLE_ALTERATIVE_TYPES_KEY); //$NON-NLS-1$
-    }
-    /**
-     * @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();
-        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
-                                        .nanoTime()
-                                            - curTime)));
-                    }
-                    return alternativeTypes;
-                }
-            }
-        }
-        if (DEBUG)
-        {
-            System.out.println(String.format("maybeAddAlternative took %d", Long
-                .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 JSFAppConfigManager appConfig = JSFAppConfigManager.getInstance(project);
-            final List converters = appConfig.getConverters();
-            for (final Iterator it = converters.iterator(); it.hasNext();)
-            {
-                final ConverterType converterType = (ConverterType) it.next();
-                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 2a70394..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/ContainmentValidatingStrategy.java
+++ /dev/null
@@ -1,228 +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.text.MessageFormat;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-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.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";
-    private final static String                        DISPLAY_NAME =
-        "Tag Containment Validator";
-    private final static ElementToTagIdentifierMapping elem2TagIdMapper = 
-        new ElementToTagIdentifierMapping();
-    private int                                        _containmentValidationCount;  // = 0;
-    private final JSFValidationContext                 _jsfValidationContext;
-
-    /**
-     * @param jsfValidationContext
-     */
-    public ContainmentValidatingStrategy(
-            final JSFValidationContext jsfValidationContext)
-    {
-        super(ID, DISPLAY_NAME);
-        _jsfValidationContext = jsfValidationContext;
-    }
-
-    @Override
-    public boolean isInteresting(DOMAdapter domAdapter)
-    {
-        return domAdapter instanceof Region2ElementAdapter;
-    }
-
-    @Override
-    public void validate(DOMAdapter domAdapter)
-    {
-        if (domAdapter instanceof Region2ElementAdapter)
-        {
-            final Region2ElementAdapter elementAdapter = 
-                (Region2ElementAdapter) domAdapter;
-            validateContainment(elementAdapter, _jsfValidationContext);
-        }
-    }
-
-    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");
-
-            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))
-                {
-                    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
-                            + " on node " + node);
-                    return;
-                }
-                catch (final EvaluationException e)
-                {
-                    JSFCorePlugin.log(e, "Problem evaluating expression: "
-                            + expr + " on node " + node);
-                    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.getNodeName(),
-                                Diagnostic.WARNING, 
-                                missingParent.getTagName(), missingParent
-                                        .getUri());
-                    }
-                }
-            }
-        }
-    }
-
-    private static final String MESSAGE_PATTERN = 
-        "Tag {0} is missing required parent tag \"{1}\" ({2})";
-
-    // TODO: need a diagnostic factory
-    private void reportContainmentProblem(
-            final IStructuredDocumentContext context,
-            final String nodeName, final int severity, 
-             final String tagName, final String uri)
-    {
-
-        final String msg = MessageFormat.format(
-                MESSAGE_PATTERN, new Object[]
-                                           {nodeName, tagName, uri});
-
-        final Diagnostic problem = 
-            new BasicDiagnostic(severity, "", -1, msg, null);
-        // 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 = nodeName.length();
-
-       _jsfValidationContext.getReporter().report(problem, start, length);
-    }
-
-}
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 7826e11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Tue Oct 02 10:22:08 PDT 2007
-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=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.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 032bf77..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.1.3.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.1.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.2.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,1.2.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 b95edcb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
+++ /dev/null
@@ -1,1557 +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";
-
-	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;
-
-    /**
-     * 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 28dc0a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
+++ /dev/null
@@ -1,451 +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
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 9014efb..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");
-			alerts = new Alerts(this, resourceBundle);
-			pluginBase = getBundle().getEntry("/");
-
-			// 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",
-						"Problems starting plug-in Faces Config Editor.", ee);
-			}
-
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Problems starting plug-in Faces Config Editor", ee));
-		}
-		
-	}
-
-	/**
-	 * 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));
-				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);
-			}
-		}
-		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/"
-						+ 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);
-			}
-		}
-		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() {
-		new GEMPreferences();
-	}
-}
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 f39845b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ /dev/null
@@ -1,1381 +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.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.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") //$NON-NLS-1$
-                        protected Collection changedResources = new ArrayList();
-
-						@SuppressWarnings("hiding") //$NON-NLS-1$
-                        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, null);
-                            }
-                            
-                            IFormPage overviewPage = new OverviewPage(FacesConfigEditor.this);
-                            addPage(overviewPage, null);
-        
-                            // Page flow
-                            createAndAddPageflowPage();
-        
-                            // pages
-                            IFormPage managedBeanPage = new ManagedBeanPage(FacesConfigEditor.this);
-                            managedBeanPageID = addPage(managedBeanPage, null);
-                            IFormPage componentsPage = new ComponentsPage(FacesConfigEditor.this);
-                            componentsPageID = addPage(componentsPage, null);
-                            IFormPage othersPage = new OthersPage(FacesConfigEditor.this);
-                            othersPageID = addPage(othersPage, null);
-                        }
-        
-                        sourcePage = new StructuredTextEditor();
-        
-                        sourcePage.setEditorPart(FacesConfigEditor.this);
-        
-                        sourcePageId = addPage(sourcePage, FacesConfigEditor.this.getEditorInput());
-                        setPageText(sourcePageId,
-                                EditorMessages.FacesConfigEditor_Source_TabName);
-                        sourcePage.update();
-                        
-                        // 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);
-						_modelLoader.getEdit()
-								.getDeploymentDescriptorResource().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);
-		}
-	}
-
-	/*
-	 * (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();
-	}
-
-	/**
-	 * 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 ba23f6c..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";
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_PROPERTY = "managed-property";
-
-	/**
-	 * 
-	 */
-	public static final String VALUE = "value";
-
-	/**
-	 * 
-	 */
-	public static final String NULL_VALUE = "null-value";
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRIES = "map-entries";
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRY = "map-entry";
-
-	/**
-	 * 
-	 */
-	public static final String LIST_ENTRIES = "list-entries";
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_RULE = "navigation-rule";
-
-	/**
-	 * 
-	 */
-	public static final String COMPONENT_SUPER_CLASS = "javax.faces.component.UIComponent";
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_SUPER_CLASS = "javax.faces.render.RenderKit";
-
-	/**
-	 * 
-	 */
-	public static final String CONVERTER_INTERFACE = "javax.faces.convert.Converter";
-
-	/**
-	 * 
-	 */
-	public static final String VALIDATOR_INTERFACE = "javax.faces.validator.Validator";
-
-	/**
-	 * 
-	 */
-	public static final String RENDERER_SUPER_CLASS = "javax.faces.render.Renderer";
-
-	/**
-	 * 
-	 */
-	public static final String ACTION_LISTENER_INTERFACE = "javax.faces.event.ActionListener";
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_HANDLE_SUPER_CLASS = "javax.faces.application.NavigationHandler";
-
-	/**
-	 * 
-	 */
-	public static final String PROPERTY_RESOLVER_SUPER_CLASS = "javax.faces.el.PropertyResolver";
-
-	/**
-	 * 
-	 */
-	public static final String STATE_MANAGER_SUPER_CLASS = "javax.faces.application.StateManager";
-
-	/**
-	 * 
-	 */
-	public static final String VARIABLE_RESOLVER_SUPER_CLASS = "javax.faces.el.VariableResolver";
-
-	/**
-	 * 
-	 */
-	public static final String VIEW_HANDLER_SUPER_CLASS = "javax.faces.application.ViewHandler";
-
-	/**
-	 * 
-	 */
-	public static final String APPLICATION_FACTORY_SUPER_CLASS = "javax.faces.application.ApplicationFactory";
-
-	/**
-	 * 
-	 */
-	public static final String FACES_CONTEXT_FACTORY_SUPER_CLASS = "javax.faces.context.FacesContextFactory";
-
-	/**
-	 * 
-	 */
-	public static final String LIFECYCLE_FACTORY_SUPER_CLASS = "javax.faces.lifecycle.LifecycleFactory";
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_FACTORY_SUPER_CLASS = "javax.faces.render.RenderKitFactory";
-
-	/**
-	 * 
-	 */
-	public static final String PHASE_LISTENER_INTERFACE = "javax.faces.event.PhaseListener";
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_APPLICATION = "application";
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_SESSION = "session";
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_REQUEST = "request";
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_NONE = "none";
-
-}
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 46438cc..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);//$NON-NLS-1$
-
-		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 170955a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
+++ /dev/null
@@ -1,529 +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);//$NON-NLS-1$
-		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 = ""; //$NON-NLS-1$
-			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 = (MapEntriesType) 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 = (ListEntriesType) 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 e85e9a3..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); //$NON-NLS-1$
-		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); //$NON-NLS-1$
-		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 abe5b23..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);//$NON-NLS-1$
-
-		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 cbcd0e8..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);//$NON-NLS-1$
-		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 36ae9fa..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); //$NON-NLS-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 0c3e155..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("");
-			}
-
-		}
-	}
-
-	/**
-	 * @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 77db79a..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())) {
-						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)) {
-					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)) {
-				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)) {
-				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 cbe79f3..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("Editing list-entries");
-	}
-
-	/*
-	 * @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);//$NON-NLS-1$
-		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);//$NON-NLS-1$    
-
-		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);//$NON-NLS-1$
-		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); //$NON-NLS-1$
-
-		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); //$NON-NLS-1$
-
-		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 ef48e05..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("Editing map-entries");
-	}
-
-	/*
-	 * @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);//$NON-NLS-1$
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);//$NON-NLS-1$
-
-		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);//$NON-NLS-1$    
-
-		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);//$NON-NLS-1$
-		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);//$NON-NLS-1$
-		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); //$NON-NLS-1$
-
-		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); //$NON-NLS-1$
-
-		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 aabdc93..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);//$NON-NLS-1$
-		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); //$NON-NLS-1$
-
-		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-NLS-1$
-	}
-
-	/*
-	 * (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 1b4a774..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";
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * Constructor of ComponentsPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public ComponentsPage(FacesConfigEditor editor) {
-		super(editor, "ComponentsPage",
-				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 0ff441a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
+++ /dev/null
@@ -1,394 +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 final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage("form_banner.gif");
-
-	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());//$NON-NLS-1$
-		form.setBackgroundImage(BANNER_IMAGE); //$NON-NLS-1$ 
-		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 aa7686e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
+++ /dev/null
@@ -1,174 +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 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.gif"));
-
-		// 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 19fbd5f..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";
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * @param editor
-	 */
-	public ManagedBeanPage(FacesConfigEditor editor) {
-		super(editor, "ManagedBeanPage",
-				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 b0f7923..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";
-	
-	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-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 1bef22f..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%";
-
-	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 38020fb..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");
-		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 24a4ddf..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";
-
-	/** 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";
-
-	/** 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",
-						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"));
-		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 + " "
-				+ 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");
-		}
-
-		// 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");
-				throw new PartInitException(
-						EditorPlugin
-								.getResourceString("Pageflow.PageflowEditor.Error.invalidPageflowFile"));
-			}
-
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile", e);
-			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);
-		}
-
-		// 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");
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Error.invalidPageflowModel");
-		}
-		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()); //$NON-NLS-1$
-
-		// 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",
-							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");
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id");
-			if ("view".equals(name) && viewid.equals(id)) {
-				String iconPath = elements[i].getAttribute("icon");
-				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 2f036ad..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,
-				getSite().getSelectionProvider()); //$NON-NLS-1$
-	}
-
-}
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 0d78297..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
+++ /dev/null
@@ -1,447 +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";
-
-	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_ActionListTable_Component;
-
-	/**
-	 * 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 ProjectWebPageSelectionDialog_Description;
-}
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 27e3f29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
+++ /dev/null
@@ -1,147 +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_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:
-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 679ca2c..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); //$NON-NLS-1$
-		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); //$NON-NLS-1$
-
-		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, //$NON-NLS-1$
-				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); //$NON-NLS-1$
-		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 ecb6c73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
+++ /dev/null
@@ -1,212 +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.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;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * 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.getInstance().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 320660c..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); //$NON-NLS-1$
-		setId(SHOW_PROPERTY_VIEW);
-		// Pageflow.Action.ShowPropertyView.ToolTip = Show properties
-		setToolTipText(PageflowMessages.Pageflow_Action_ShowPropertyView_ToolTip); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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");
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.canNotShowPropertyView
-						// = Failed to show property sheet view.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotShowPropertyView",
-										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 b57ab3a..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";
-
-	/** 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",
-											"Pageflow.PageflowEditor.Alert.ExistingPage",
-											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",
-							"Pageflow.PageflowEditor.Alert.ExistingPage",
-							((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 56b21a4..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-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 eccb807..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",
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo");
-			}
-		} 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",
-					"Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile");// )
-		}
-	}
-
-	/**
-	 * 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",
-										e);
-						// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle
-						// = Open JSF File Error
-						EditorPlugin
-								.getAlerts()
-								.error(
-										"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle",
-										"Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF");
-					}
-				}
-			});
-		} 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",
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo",
-					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 1d90a74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
+++ /dev/null
@@ -1,136 +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.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 = "change location command";
-
-	/** resize command label */
-	private static final String COMMAND_LABEL_RESIZE = "resize command";
-
-	/** 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 constaints
-	 */
-	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 32cd665..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
+++ /dev/null
@@ -1,489 +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 {
-	/** 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("facesconfig/Pageflow_Quickfix_Error.gif");
-
-	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");
-			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 b25bdb9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.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 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.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");
-		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("label here");
-			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 0a7fbae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.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.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.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("add");
-		add.setDebugLabel("PageFlowXYEP add subpart"); //$NON-NLS-1$
-
-		SetConstraintCommand setConstraint = new SetConstraintCommand();
-
-		setConstraint.setLocation(rect);
-		setConstraint.setPart(part);
-		setConstraint.setLabel("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("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 56d6768..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("");
-	}
-
-	/**
-	 * 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 ce9358b..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";
-
-	/**
-	 * The package namespace URI. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http://www.sybase.com/suade/pageflow";
-
-	/**
-	 * The package namespace name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "pageflow";
-
-	/**
-	 * 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 2ce5b30..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)) {
-				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 43ea15f..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";
-
-	/**
-	 * @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";
-
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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: ");
-		result.append(name);
-		result.append(", comment: ");
-		result.append(comment);
-		result.append(", x: ");
-		result.append(x);
-		result.append(", y: ");
-		result.append(y);
-		result.append(", width: ");
-		result.append(width);
-		result.append(", height: ");
-		result.append(height);
-		result.append(", referenceLink: ");
-		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 6da1936..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.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.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- 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()
-					+ "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- 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 381e1d2..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: ");
-		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"));
-		}
-		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 755c514..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,550 +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.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- 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(
-						"Recursive containment not allowed for " + 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: ");
-		result.append(d1Width);
-		result.append(", d1Height: ");
-		result.append(d1Height);
-		result.append(", d2Width: ");
-		result.append(d2Width);
-		result.append(", d2Height: ");
-		result.append(d2Height);
-		result.append(", weight: ");
-		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 48228bf..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,891 +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.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;
-
-/**
- * <!-- 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(
-						"Recursive containment not allowed for " + 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: ");
-		result.append(getSmallicon());
-		result.append(", largeicon: ");
-		result.append(getLargeicon());
-		result.append(", fromaction: ");
-		result.append(getFromaction());
-		result.append(", outcome: ");
-		result.append(getOutcome());
-		result.append(", redirect: ");
-		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 0e86e87..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,388 +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.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;
-
-/**
- * <!-- 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(
-						"Recursive containment not allowed for " + 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 f08d5c3..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,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflow_Nodes(), this.getPageflowNode(), this
-				.getPageflowNode_Pageflow(), "nodes", null, 0, -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,
-				!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,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowNodeEClass, PageflowNode.class, "PageflowNode",
-				IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflowNode_Pageflow(), this.getPageflow(), this
-				.getPageflow_Nodes(), "pageflow", null, 1, 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,
-				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,
-				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,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPFLink_Pageflow(), this.getPageflow(), this
-				.getPageflow_Links(), "pageflow", null, 1, 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,
-				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,
-				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,
-				!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,
-				!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,
-				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,
-				!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,
-				!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,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowElementEClass, PageflowElement.class,
-				"PageflowElement", IS_ABSTRACT, !IS_INTERFACE,
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPageflowElement_Name(), ecorePackage.getEString(),
-				"name", "unnamed", 0, 1, PageflowElement.class, !IS_TRANSIENT,
-				!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,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_X(), ecorePackage.getEInt(), "x",
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Y(), ecorePackage.getEInt(), "y",
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				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,
-				!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,
-				!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,
-				IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_ReferenceLink(), ecorePackage
-				.getEString(), "referenceLink", "", 0, 1,
-				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,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFPage_Path(), ecorePackage.getEString(), "path",
-				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,
-				!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,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkBendpointEClass, PageflowLinkBendpoint.class,
-				"PFLinkBendpoint", !IS_ABSTRACT, !IS_INTERFACE,
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFLinkBendpoint_D1Width(), ecorePackage.getEInt(),
-				"d1Width", null, 0, 1, PageflowLinkBendpoint.class,
-				!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,
-				!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,
-				!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,
-				!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,
-				!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,
-				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 11d99e1..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: ");
-		result.append(getPath());
-		result.append(", smallicon: ");
-		result.append(getSmallicon());
-		result.append(", largeicon: ");
-		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 80c118d..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 "";
-	}
-
-	/**
-	 * 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 = "";
-		for (int i = 0, n = data.size(); i < n; i++) {
-			result += resolvePath((EObject) data.get(i)) + "|";
-		}
-		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 46d3fc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.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.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.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 = "#{";
-
-	private static String JSF_EL_RIGHT_BRACE = "}";
-
-	/** 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 = PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;//$NON-NLS-1$
-
-		if (jspName != null && jspName.length() > 0) {
-			actionListTitle += " in " + jspName;
-		}
-		// 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); //$NON-NLS-1$
-		TableColumn actionCol = new TableColumn(actionTable, SWT.NONE);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Action
-		// = Action
-		actionCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action);//$NON-NLS-1$
-
-		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-NLS-1$
-
-	}
-
-	/*
-	 * (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");
-				if (idAttr != null)
-					componentName.append(idAttr.getNodeValue());
-
-				componentName.append("(").append(node.getTagName()).append(")"); //$NON-NLS-1$
-
-				Attr actionAttr = node.getAttributeNode("action");
-				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 f6ba9c3..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 = "";
-		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 dd4786f..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 "";
-	}
-
-	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 e7ce738..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";
-
-	/**
-	 * the attribute tag id
-	 */
-	public static final String ATTRIBUTE_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute";
-
-	/**
-	 * the link section id
-	 */
-	public static final String LINK_SECTION = "attribute.link"; // 4
-
-	/**
-	 * the page section id
-	 */
-	public static final String PAGE_SECTION = "attribute.page"; // 3
-
-	/**
-	 * the editor section id
-	 */
-	public static final String EDITOR_SECTION = "attribute.editor"; // 1
-
-	/**
-	 * the top section id
-	 */
-	public static final String TOP_SECTION = "top"; // 0
-
-}
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 606511a..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 = "";
-		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 a62b1da..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",
-												"Pageflow.PageflowEditor.Alert.ExistingPage",
-												value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage");
-							}
-						}
-						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)) {
-			return PageflowMessages.Pageflow_Model_Attributes_comment;
-		}
-
-		if ("name".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_name;
-		}
-
-		if ("largeicon".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_largeicon;
-		}
-
-		if ("smallicon".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_smallicon;
-		}
-		
-		if ("source".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_source;
-		}
-		
-		if ("target".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_target;
-		}
-
-		if ("fromaction".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_fromaction;
-		}
-
-		if ("path".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_path;
-		}
-		if ("begin".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_begin;
-		}
-		if ("end".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_end;
-		}
-		if ("configfile".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_configfile;
-		}
-		if ("outcome".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_outcome;
-		}
-		if ("redirect".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_redirect;
-		}
-
-		return "";
-	}
-
-	/*
-	 * (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-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 8eaf819..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
+++ /dev/null
@@ -1,188 +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.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("Note",
-										"Please select an existing page");
-								// "Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-								// "Pageflow.PageflowEditor.Alert.ExistingPage",
-								// (String) value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage");
-							}
-						}
-						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 c6adc01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.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.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 {
-
-	/**
-	 * Default constructor
-	 */
-	public PageflowSectionLabelProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		Image result = EditorPlugin.getDefault().getImage(
-				"facesconfig/FacesConfig_Pageflow16.gif");
-
-		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 a9747a9..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";
-
-	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 1c2db0c..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 = "";
-			String jspPage = "";
-			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("...");
-		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 e7e5f33..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("...");
-		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-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 00b214a..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",
-													"Pageflow.PageflowEditor.Alert.ExistingPage",
-													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 48be8a8..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");
-			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");
-		} else if (DEBUG)
-			System.out.println("Something is added");
-	}
-
-	/**
-	 * 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");
-		} 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");
-		} 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");
-	}
-
-	/**
-	 * 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");
-	}
-
-	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 7848733..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 = "*";
-		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");
-				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");
-					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");
-				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 ba3583a..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");
-				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 6a5e35c..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 = "*";
-		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 = "*";
-		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 = "";
-			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 af885b0..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";
-
-    /** JSF HTML TagLib name */
-    public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html";
-
-    /** 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 5f57ddf..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());
-
-			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");
-		for (int i = 1; i < segs.length; i++) {
-			pageflowPath = pageflowPath.append(segs[i]);
-		}
-		// pageflowPath.removeFileExtension();
-		pageflowPath = pageflowPath.addFileExtension("pageflow");
-		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 7ed59c9..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",
-        				EditorPlugin
-        						.getResourceString("Pageflow.Error.InvalidResource")
-        						+ 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 6d97611..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("[.]");
-			managedBeanName = actionParts[0];//$NON-NLS-1$
-		}
-
-		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 33cb5d9..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 63bff4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
+++ /dev/null
@@ -1,467 +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 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";
-
-	private static String DEFAULT_ICON = "editor/CompoundNode.gif";
-
-	private static Image minimizeImage = EditorPlugin.getDefault().getImage(
-			"minimize.gif");
-
-	private static Image minimizeHiliteImage = EditorPlugin.getDefault()
-			.getImage("minimize_hilite.gif");
-
-	private static Image maximizeImage = EditorPlugin.getDefault().getImage(
-			"maximize.gif");
-
-	private static Image maximizeHiliteImage = EditorPlugin.getDefault()
-			.getImage("maximize_hilite.gif");
-
-	private static Image restoreImage = EditorPlugin.getDefault().getImage(
-			"restore.gif");
-
-	private static Image restoreHiliteImage = EditorPlugin.getDefault()
-			.getImage("restore_hilite.gif");
-
-	/**
-	 * 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("Minimize"));
-
-			maxButton.setVisible(true);
-			maxButton.setState(false);
-			maxButton.setToolTip(new Label("Maximize"));
-
-			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("Restore"));
-		}
-		// 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 9bb7fa5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
+++ /dev/null
@@ -1,792 +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.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 }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Manhattan, LINE_ROUTING_MANHATTAN } //$NON-NLS-1$ //$NON-NLS-2$
-	};
-
-	private final static String[][] m_labelPlacementLabels = {
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Top, LABEL_PLACEMENT_TOP }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Bottom, LABEL_PLACEMENT_BOTTOM }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-						PreferenceMessages.CanvasPreferences_LABEL_Left, LABEL_PLACEMENT_LEFT }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-							PreferenceMessages.CanvasPreferences_LABEL_Right, LABEL_PLACEMENT_RIGHT } //$NON-NLS-1$ //$NON-NLS-2$
-	};
-
-	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);
-		initializeDefaults();
-	}
-
-	/**
-	 * Sets the default values of the preferences.
-	 */
-	private void initializeDefaults() {
-		IPreferenceStore store = 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));
-	}
-
-	/**
-	 * 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); //$NON-NLS-1$
-		canvasColor = addColorField(
-				CANVAS_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor, canvasGroup); //$NON-NLS-1$
-		addBooleanField(
-				SNAP_TO_GEOMETRY,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGeometry, canvasGroup); //$NON-NLS-1$
-		snapToGrid = addBooleanField(
-				SNAP_TO_GRID,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGrid, canvasGroup); //$NON-NLS-1$
-		gridColor = addColorField(
-				GRID_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor, canvasGroup); //$NON-NLS-1$
-		gridWidth = addIntegerField(
-				GRID_WIDTH,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridWidth, canvasGroup); //$NON-NLS-1$
-		gridHeight = addIntegerField(
-				GRID_HEIGHT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridHeight, canvasGroup); //$NON-NLS-1$
-
-		iconGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_IconGroup); //$NON-NLS-1$
-		iconFont = addFontField(
-				FIGURE_LABEL_FONT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont, iconGroup); //$NON-NLS-1$
-		addComboField(LABEL_PLACEMENT, PreferenceMessages.CanvasPreferenceTab_LABEL_LabelPlacement, //$NON-NLS-1$
-				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); //$NON-NLS-1$
-		showLineLabels = addBooleanField(SHOW_LINE_LABELS, PreferenceMessages.CanvasPreferenceTab_LABEL_ShowLineLabels,
-				lineGroup);
-		lineFont = addFontField(
-				LINE_LABEL_FONT,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont, lineGroup); //$NON-NLS-1$
-		lineLabelColor = addColorField(
-				LINE_LABEL_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor, lineGroup); //$NON-NLS-1$
-		lineColor = addColorField(
-				LINE_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor, lineGroup); //$NON-NLS-1$
-		addIntegerField(
-				LINE_WIDTH,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineWidth, lineGroup); //$NON-NLS-1$
-		addComboField(LINE_ROUTING,  PreferenceMessages.CanvasPreferenceTab_LABEL_LineRouting, //$NON-NLS-1$
-				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 4626c4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.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.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";
-
-	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;
-
-}
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 a65ffd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
+++ /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
-###############################################################################
-#
-# 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.
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 4b79429..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";
-
-	// 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 2a751ad..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 "";
-	}
-
-	/**
-	 * @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 = "";
-
-		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 = "";
-			else
-				this.label = text;
-			textExtents = null;
-		}
-
-		/**
-		 * @return the text extents
-		 */
-		public Dimension calculateTextExtents() {
-			textExtents = FigureUtilities.getTextExtents(label == null ? "W"
-					: 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 d382875..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
+++ /dev/null
@@ -1,620 +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 {
-		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("Window");
-
-		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 "??";
-		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 3a729c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
+++ /dev/null
@@ -1,113 +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 {
-	/** 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 = "";
-
-		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(
-					"facesconfig/FacesConfig_ManagedBean.gif"); //$NON-NLS-1$
-
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) obj;
-			if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Session.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Request.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Application.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_None.gif");
-			} else {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope.gif");
-			}
-		}
-
-		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 393ece2..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); //$NON-NLS-1$    	
-
-		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 34b51e9..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); //$NON-NLS-1$
-		getSection().setDescription(description); //$NON-NLS-1$
-	}
-
-	/*
-	 * (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 2df812e..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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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 7469d7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
+++ /dev/null
@@ -1,423 +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.PlatformUI;
-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()) {
-					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/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 551b85f..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); //$NON-NLS-1$
-		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 054fff7..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); //$NON-NLS-1$
-		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 40aa389..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);//$NON-NLS-1$
-
-		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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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 db1dcb4..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); //$NON-NLS-1$
-		getSection().setText(EditorMessages.InitializationSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.InitializationSection_Description); //$NON-NLS-1$
-
-	}
-
-	/*
-	 * (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",
-									"ManagedBeanInitializationSection.RemoveManagedProperty")) {
-				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",
-									"ManagedBeanInitializationSection.RemoveMapEntries")) {
-				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",
-									"ManagedBeanInitializationSection.RemoveListEntries")) {
-				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 f06070e..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);//$NON-NLS-1$
-		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);//$NON-NLS-1$    
-		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);//$NON-NLS-1$
-		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, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-		}
-		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, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-		}
-
-		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 e99bbeb..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);//$NON-NLS-1$
-		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);//$NON-NLS-1$
-		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);//$NON-NLS-1$
-		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 e7fe32d..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); //$NON-NLS-1$
-		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 a8b3548..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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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 7f8d7e8..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);//$NON-NLS-1$    
-
-		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);//$NON-NLS-1$
-		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);//$NON-NLS-1$
-		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, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-		}
-		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); //$NON-NLS-1$
-		}
-		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, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-		}
-		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 c7f5016..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_typecol);
-		typecol.setResizable(true);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_namecol);
-		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 c19346d..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); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.OverviewPage_GeneralSection_description); //$NON-NLS-1$
-	}
-
-	/*
-	 * (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); //$NON-NLS-1$ 	 
-		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); //$NON-NLS-1$
-		versionText = toolkit.createText(container, "");
-		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 95746ed..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);//$NON-NLS-1$
-
-		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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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 ea1b719..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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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, //$NON-NLS-1$
-				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 = "";
-			}
-			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 3e8e20f..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); //$NON-NLS-1$
-		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 034e70f..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); //$NON-NLS-1$
-		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 59283e3..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";
-
-	/**
-	 * fully qualifed name of a Map
-	 */
-	private static final String JAVA_UTIL_MAP = "java.util.Map";
-
-	/**
-	 * 
-	 */
-	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;
-
-		getterMethod = type.getMethod(getterMethodName, null);
-		if (getterMethod == null || !getterMethod.exists()
-				|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-			getterMethodName = "is" + methodBaseName;
-			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")) {
-					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")) {
-					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;
-
-		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$
-			{
-				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) {
-			propertyName = methodName.substring(3);
-		} else if (methodName.startsWith("is") && methodName.length() > 2) // Starts
-		// 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) {
-			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) //$NON-NLS-1$
-			{
-				String setterMethodName = "set"
-						+ 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) //$NON-NLS-1$
-			{
-				// first form of getter method, "get..."
-				String getterMethodName = "get"
-						+ 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"
-							+ 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 2983664..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("[")) {
-			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$
-		{
-			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")) {
-						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("[")) {
-			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 + "[]";
-				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")) {
-							foundName = getQualifiedTypeName(superTypes[i],
-									typeName);
-							if (foundName != null) {
-								qualifiedTypeName = foundName;
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// Add back array identifiers
-		while (arrayNum > 0) {
-			qualifiedTypeName = qualifiedTypeName + "[]";
-			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 c17cb9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
+++ /dev/null
@@ -1,87 +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.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-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(IProject project, String beanName) 
-    {
-	    JSFAppConfigManager appCfgMgr = JSFAppConfigManager.getInstance(project);
-        
-		if (appCfgMgr != null) 
-        {
-			List beans = appCfgMgr.getManagedBeans();
-
-			// Iterate through the bean list
-			for (Iterator i = beans.iterator(); i.hasNext();) {
-				Object o = i.next();
-				if (o instanceof ManagedBeanType) {
-					ManagedBeanType mbti = (ManagedBeanType) o;
-					if (mbti.getManagedBeanName() != null) {
-						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(IProject project,
-			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 1a0030a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
+++ /dev/null
@@ -1,180 +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 {
-
-	/**
-	 * 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 "";
-		}
-
-		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 = "&lt;";
-				break;
-			case '>':
-				entity = "&gt;";
-				break;
-			case '\'':
-				entity = "&apos;";
-				break;
-			case '\"':
-				entity = "&quot;";
-				break;
-			case '&':
-				entity = "&amp;";
-				break;
-			case '\r':
-				entity = "&#xD;";
-				break;
-			case '\t':
-				entity = "&#x9;";
-				break;
-			case '\n':
-				entity = "&#xA;";
-				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 "";
-		}
-
-		String result = new String(str);
-
-		result = result.replaceAll("&amp;", "&");
-		result = result.replaceAll("&lt;", "<");
-		result = result.replaceAll("&gt;", ">");
-		result = result.replaceAll("&apos;", "\'");
-		result = result.replaceAll("&quot;", "\"");
-		result = result.replaceAll("&#xD;", "\r");
-		result = result.replaceAll("&#x9;", "\t");
-		result = result.replaceAll("&#xA;", "\n");
-
-		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 e0bc3a1..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 = "";
-		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 44e01e0..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); //$NON-NLS-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); //$NON-NLS-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); //$NON-NLS-1$
-			}
-			return false;
-		} else if (JavaClassUtils.hasIllegalCharacters(managedBeanNameText
-				.getText())) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName); //$NON-NLS-1$
-			}
-			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");
-
-		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);
-			if (beanName != null && beanName.length() > 0) {
-				beanName = (beanName.substring(0, 1)).toLowerCase()
-						+ (beanName.substring(1));
-
-				beanName = ManagedBeanUtil.getDefaultManagedBeanName(
-						currentProject, beanName);
-
-			} else
-				beanName = "";
-			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() }); //$NON-NLS-1$
-		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 ed4354a..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(), }); //$NON-NLS-1$
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_PackageName, //$NON-NLS-1$
-							getPackageText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_TypeName, //$NON-NLS-1$
-							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 a62ede9..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";
-
-	/** 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 65f5797..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";
-
-	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 aca62eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:06:00 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.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.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.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 a64709a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,29 +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.1.1.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,1.2.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/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 ebedef3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-	/**
-	 * 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
-	 * --> <!-- end-user-doc -->
-     * @param object 
-     * @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
-     */
-	public String getText(Object object) {
-        String label = ((ActionListenerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ActionListenerType_type") :
-            getString("_UI_ActionListenerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-		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 137af7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ApplicationExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ApplicationExtensionType_type") :
-            getString("_UI_ApplicationExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 ecab7b9..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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((ApplicationFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ApplicationFactoryType_type") :
-            getString("_UI_ApplicationFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 c9925f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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);
-
-            addIdPropertyDescriptor(object);
-            addELResolverPropertyDescriptor(object);
-            addResourceBundlePropertyDescriptor(object);
-            addApplicationExtensionPropertyDescriptor(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 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 specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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__LOCALE_CONFIG:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 c378606..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 16f4fc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.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.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.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.FacesConfigPlugin;
-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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 bfb262b..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 b0edf90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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 -->
- * 
- */
-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";
-
-    /**
-     * 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);
-
-            addAttributeClassPropertyDescriptor(object);
-            addDefaultValuePropertyDescriptor(object);
-            addSuggestedValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Attribute Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addAttributeClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_attributeClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_attributeClass_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Default Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addDefaultValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_defaultValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_defaultValue_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Suggested Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSuggestedValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_suggestedValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_suggestedValue_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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_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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(AttributeType.class)) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-            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_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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_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
-					.getAttributeName().getTextContent();
-		case 1:
-			return attribute.getAttributeClass() == null ? "" : attribute
-					.getAttributeClass().getTextContent();
-		case 2:
-			return attribute.getDefaultValue() == null ? "" : attribute
-					.getDefaultValue().getTextContent();
-		case 3:
-			return attribute.getSuggestedValue() == null ? "" : attribute
-					.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 163ec94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 85a232e..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 d1b8a4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.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.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.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.FacesConfigPlugin;
-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";
-
-    /**
-     * 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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ComponentExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ComponentExtensionType_type") :
-            getString("_UI_ComponentExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 3dae3c0..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 6fbc666..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.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.ComponentType;
-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";
-
-	/**
-	 * 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"),
-				getString("_UI_PropertyDescriptor_description",
-						"_UI_ComponentType_componentClass_feature",
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE
-						.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"),
-				getString("_UI_PropertyDescriptor_description",
-						"_UI_ComponentType_componentType_feature",
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentType(), 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_ComponentType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ComponentType_id_feature", "_UI_ComponentType_type"),
-                 FacesConfigPackage.Literals.COMPONENT_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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
-	 */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentType"));
-    }
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * 
-	 */
-	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")
-				: getString("_UI_ComponentType_type") + " " + label;
-	}
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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) {
-		ComponentType component = (ComponentType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return component.getComponentClass() == null ? "" : component
-					.getComponentClass().getTextContent();
-		}
-		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 9319c02..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 a7f7e23..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 15afa95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ConverterExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterExtensionType_type") :
-            getString("_UI_ConverterExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 f614303..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.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.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";
-
-    /**
-     * 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
-     */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterForClassType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_textContent_feature", "_UI_ConverterForClassType_type"),
-                 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
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterForClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_id_feature", "_UI_ConverterForClassType_type"),
-                 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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterForClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ConverterForClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterForClassType_type") :
-            getString("_UI_ConverterForClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 c865d06..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 d76abca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.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.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.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
- */
-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";
-
-	/**
-	 * 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);
-
-            addConverterIdPropertyDescriptor(object);
-            addConverterForClassPropertyDescriptor(object);
-            addConverterClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter Id feature. 
-	 * 
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConverterIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterId_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter For Class feature. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConverterForClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterForClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterForClass_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter Class feature. 
-	 * 
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addConverterClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterClass_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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
-     */
-	public String getText(Object object) {
-        String label = ((ConverterType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterType_type") :
-            getString("_UI_ConverterType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ConverterType.class)) {
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_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__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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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) {
-		ConverterType converter = (ConverterType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return converter.getConverterClass() == null ? "" : converter
-					.getConverterClass().getTextContent();
-		}
-		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 5522e12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-	/**
-	 * 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") :
-            label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 27370e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((DefaultRenderKitIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultRenderKitIdType_type") :
-            getString("_UI_DefaultRenderKitIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-		return null;
-	}
-
-}
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 721f68d..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 95bcec3..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 c64caca..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
- */
-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";
-
-    /**
-     * 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 -->
-	 * <!-- end-user-doc -->
-     * @param object 
-     * @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 -->
-	 * <!-- end-user-doc -->
-     * @param object 
-     * @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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 d309390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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";
-
-    /**
-     * 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MIXED);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * This returns DocumentRoot.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DocumentRoot"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        return getString("_UI_DocumentRoot_type");
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DocumentRoot.class)) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME,
-                 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-        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_TYPE,
-                 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER,
-                 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-        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__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__FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        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_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__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__PHASE_LISTENER,
-                 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-
-        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__REFERENCED_BEAN,
-                 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER,
-                 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT,
-                 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER,
-                 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR,
-                 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE,
-                 FacesConfigFactory.eINSTANCE.createValueType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER,
-                 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER,
-                 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-    }
-
-    /**
-     * 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 dc315d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 c8f7c1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-    /**
-     * 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,
-                 false,
-                 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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;
-    }
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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__ATTRIBUTES:
-            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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 3bdffc1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 0552a35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 60b7670..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";
-
-	/**
-	 * 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 c124a24..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((FacesConfigExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacesConfigExtensionType_type") :
-            getString("_UI_FacesConfigExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 9ae32c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,2397 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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.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.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.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.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.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.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.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.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.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.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.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 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 (actionListenerTypeItemProvider != null) actionListenerTypeItemProvider.dispose();
-        if (applicationFactoryTypeItemProvider != null) applicationFactoryTypeItemProvider.dispose();
-        if (applicationTypeItemProvider != null) applicationTypeItemProvider.dispose();
-        if (attributeClassTypeItemProvider != null) attributeClassTypeItemProvider.dispose();
-        if (attributeExtensionTypeItemProvider != null) attributeExtensionTypeItemProvider.dispose();
-        if (attributeNameTypeItemProvider != null) attributeNameTypeItemProvider.dispose();
-        if (attributeTypeItemProvider != null) attributeTypeItemProvider.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 (defaultLocaleTypeItemProvider != null) defaultLocaleTypeItemProvider.dispose();
-        if (defaultRenderKitIdTypeItemProvider != null) defaultRenderKitIdTypeItemProvider.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 (facesConfigTypeItemProvider != null) facesConfigTypeItemProvider.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 (fromActionTypeItemProvider != null) fromActionTypeItemProvider.dispose();
-        if (fromOutcomeTypeItemProvider != null) fromOutcomeTypeItemProvider.dispose();
-        if (fromViewIdTypeItemProvider != null) fromViewIdTypeItemProvider.dispose();
-        if (iconTypeItemProvider != null) iconTypeItemProvider.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 (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 (managedPropertyTypeItemProvider != null) managedPropertyTypeItemProvider.dispose();
-        if (mapEntriesTypeItemProvider != null) mapEntriesTypeItemProvider.dispose();
-        if (mapEntryTypeItemProvider != null) mapEntryTypeItemProvider.dispose();
-        if (messageBundleTypeItemProvider != null) messageBundleTypeItemProvider.dispose();
-        if (navigationCaseTypeItemProvider != null) navigationCaseTypeItemProvider.dispose();
-        if (navigationHandlerTypeItemProvider != null) navigationHandlerTypeItemProvider.dispose();
-        if (navigationRuleTypeItemProvider != null) navigationRuleTypeItemProvider.dispose();
-        if (nullValueTypeItemProvider != null) nullValueTypeItemProvider.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 (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 (smallIconTypeItemProvider != null) smallIconTypeItemProvider.dispose();
-        if (stateManagerTypeItemProvider != null) stateManagerTypeItemProvider.dispose();
-        if (suggestedValueTypeItemProvider != null) suggestedValueTypeItemProvider.dispose();
-        if (supportedLocaleTypeItemProvider != null) supportedLocaleTypeItemProvider.dispose();
-        if (toViewIdTypeItemProvider != null) toViewIdTypeItemProvider.dispose();
-        if (validatorClassTypeItemProvider != null) validatorClassTypeItemProvider.dispose();
-        if (validatorIdTypeItemProvider != null) validatorIdTypeItemProvider.dispose();
-        if (validatorTypeItemProvider != null) validatorTypeItemProvider.dispose();
-        if (valueClassTypeItemProvider != null) valueClassTypeItemProvider.dispose();
-        if (valueTypeItemProvider != null) valueTypeItemProvider.dispose();
-        if (variableResolverTypeItemProvider != null) variableResolverTypeItemProvider.dispose();
-        if (viewHandlerTypeItemProvider != null) viewHandlerTypeItemProvider.dispose();
-        if (applicationExtensionTypeItemProvider != null) applicationExtensionTypeItemProvider.dispose();
-        if (converterExtensionTypeItemProvider != null) converterExtensionTypeItemProvider.dispose();
-        if (elResolverTypeItemProvider != null) elResolverTypeItemProvider.dispose();
-        if (facesConfigExtensionTypeItemProvider != null) facesConfigExtensionTypeItemProvider.dispose();
-        if (factoryExtensionTypeItemProvider != null) factoryExtensionTypeItemProvider.dispose();
-        if (lifecycleExtensionTypeItemProvider != null) lifecycleExtensionTypeItemProvider.dispose();
-        if (managedBeanExtensionTypeItemProvider != null) managedBeanExtensionTypeItemProvider.dispose();
-        if (navigationRuleExtensionTypeItemProvider != null) navigationRuleExtensionTypeItemProvider.dispose();
-        if (validatorExtensionTypeItemProvider != null) validatorExtensionTypeItemProvider.dispose();
-        if (resourceBundleTypeItemProvider != null) resourceBundleTypeItemProvider.dispose();
-        if (baseNameTypeItemProvider != null) baseNameTypeItemProvider.dispose();
-        if (varTypeItemProvider != null) varTypeItemProvider.dispose();
-        if (renderKitExtensionTypeItemProvider != null) renderKitExtensionTypeItemProvider.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 47bc95f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-        }
-        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 specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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__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);
-        }
-        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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-            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__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:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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__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()));
-    }
-
-    /**
-     * 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 bc25a8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((FacesContextFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacesContextFactoryType_type") :
-            getString("_UI_FacesContextFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 cae6a96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.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.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.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.FacesConfigPlugin;
-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
-     */
-	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
-     */
-	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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 1aa8229..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 1177216..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
- */
-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";
-
-    /**
-     * 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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()
-					.getTextContent();
-		case 1:
-			return facet.getDisplayName().size() > 0 ? ((DisplayNameType) facet
-					.getDisplayName().get(0)).getTextContent() : "";
-		case 2:
-			return facet.getDescription().size() > 0 ? ((DescriptionType) facet
-					.getDescription().get(0)).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/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 4a366e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((FactoryExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FactoryExtensionType_type") :
-            getString("_UI_FactoryExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 94bb34f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__FACES_CONTEXT_FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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__FACES_CONTEXT_FACTORY:
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__FACES_CONTEXT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-    }
-
-    /**
-     * 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 2fe5038..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 6a02075..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 4e11015..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 4162aa7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-    /**
-     * 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);
-
-            addSmallIconPropertyDescriptor(object);
-            addLargeIconPropertyDescriptor(object);
-            addLangPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Small Icon feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSmallIconPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IconType_smallIcon_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_IconType_smallIcon_feature", "_UI_IconType_type"),
-                 FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Large Icon feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addLargeIconPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IconType_largeIcon_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_IconType_largeIcon_feature", "_UI_IconType_type"),
-                 FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON,
-                 true,
-                 false,
-                 false,
-                 null,
-                 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_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 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(IconType.class)) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-            case FacesConfigPackage.ICON_TYPE__LANG:
-            case FacesConfigPackage.ICON_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 d34d042..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 e4e77b8..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 79a6ae5..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 bd0f333..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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 -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LifecycleExtensionTypeItemProvider
-    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";
-
-    /**
-     * 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
-     */
-    public String getText(Object object) {
-        String label = ((LifecycleExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LifecycleExtensionType_type") :
-            getString("_UI_LifecycleExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 0cba622..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((LifecycleFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LifecycleFactoryType_type") :
-            getString("_UI_LifecycleFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-			}
-
-			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 deb42c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 2614396..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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);
-
-            addValueClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Value Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValueClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ListEntriesType_valueClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ListEntriesType_valueClass_feature", "_UI_ListEntriesType_type"),
-                 FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ListEntriesType.class)) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 82820fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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;
-
-/**
- * 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";
-
-    /**
-     * 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
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_LocaleConfigType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_LocaleConfigType_id_feature", "_UI_LocaleConfigType_type"),
-                 FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LocaleConfigType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((LocaleConfigType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LocaleConfigType_type") :
-            getString("_UI_LocaleConfigType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 17253fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanClassType_type") :
-            getString("_UI_ManagedBeanClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 7f0c609..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 47b3b5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanNameType_type") :
-            getString("_UI_ManagedBeanNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 d066a36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanScopeType_type") :
-            getString("_UI_ManagedBeanScopeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 fe751e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-
-            addManagedBeanNamePropertyDescriptor(object);
-            addManagedBeanClassPropertyDescriptor(object);
-            addManagedBeanScopePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanName_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanClass_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Scope feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanScopePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanScope_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanScope_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE,
-                 true,
-                 false,
-                 false,
-                 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_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 specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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_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")
-                : label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedBeanType.class)) {
-            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__ID:
-                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_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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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_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
-					.getManagedBeanName().getTextContent();
-		case 1:
-			return managedBean.getManagedBeanScope() == null ? "" : managedBean
-					.getManagedBeanScope().getTextContent();
-
-		case 2:
-			return managedBean.getManagedBeanClass() == null ? "" : managedBean
-					.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 635774e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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);
-
-            addPropertyNamePropertyDescriptor(object);
-            addPropertyClassPropertyDescriptor(object);
-            addNullValuePropertyDescriptor(object);
-            addValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Property Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_propertyName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_propertyName_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Property Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_propertyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_propertyClass_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Null Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addNullValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_nullValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_nullValue_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 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_ManagedPropertyType_value_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_value_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE,
-                 true,
-                 false,
-                 false,
-                 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_ManagedPropertyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_id_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__MAP_ENTRIES);
-            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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedPropertyType"));
-    }
-
-    /**
-     * 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")
-                : label;
-
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedPropertyType.class)) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-            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__MAP_ENTRIES:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__MAP_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-        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
-					.getPropertyName().getTextContent();
-		case 1:
-			return attribute.getPropertyClass() == null ? "" : attribute
-					.getPropertyClass().getTextContent();
-		case 2:
-			if(attribute.getValue() != null)
-			{
-				return attribute.getValue().getTextContent();
-			}
-			else if(attribute.getNullValue() != null)
-				return "<null-value>";
-			else if(attribute.getMapEntries() != null)
-				return "<map-entries>";
-			else if(attribute.getListEntries() != null)
-				return "<list-entries>";
-			return "";
-		}
-		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 b2ce1ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-    /**
-     * 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);
-
-            addKeyClassPropertyDescriptor(object);
-            addValueClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Key Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addKeyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntriesType_keyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_keyClass_feature", "_UI_MapEntriesType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Value Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValueClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntriesType_valueClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_valueClass_feature", "_UI_MapEntriesType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__MAP_ENTRY);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(MapEntriesType.class)) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 67c7a60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-    /**
-     * 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);
-
-            addKeyPropertyDescriptor(object);
-            addNullValuePropertyDescriptor(object);
-            addValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Key feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addKeyPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_key_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_key_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Null Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addNullValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_nullValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_nullValue_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 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_MapEntryType_value_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_value_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE,
-                 true,
-                 false,
-                 false,
-                 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_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 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;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(MapEntryType.class)) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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) {
-
-		MapEntryType mapEntry = (MapEntryType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return mapEntry.getKey() == null ? "" : mapEntry.getKey()
-					.getTextContent();
-		case 1:
-			if (mapEntry.getNullValue() != null)
-            {
-				return "<null-value>";
-            }
-			return mapEntry.getValue() == null ? "" : mapEntry.getValue()
-					.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 550bd1d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((MessageBundleType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_MessageBundleType_type") :
-            getString("_UI_MessageBundleType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		return null;
-	}
-
-}
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 4c5a89d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-
-            addFromActionPropertyDescriptor(object);
-            addFromOutcomePropertyDescriptor(object);
-            addToViewIdPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the From Action feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromActionPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_fromAction_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_fromAction_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the From Outcome feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromOutcomePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_fromOutcome_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_fromOutcome_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the To View Id feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addToViewIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_toViewId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_toViewId_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NavigationCaseType.class)) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-            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__REDIRECT:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 ? ""
-					: ((NavigationRuleType) navigationcase.eContainer())
-							.getFromViewId().getTextContent();
-		case 1:
-			return navigationcase.getFromOutcome() == null ? "" : navigationcase
-					.getFromOutcome().getTextContent();
-		case 2:
-			return navigationcase.getToViewId() == null ? "" : navigationcase
-					.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 d7af3b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((NavigationHandlerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationHandlerType_type") :
-            getString("_UI_NavigationHandlerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 af2dd45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((NavigationRuleExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationRuleExtensionType_type") :
-            getString("_UI_NavigationRuleExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 1cc12f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-
-            addFromViewIdPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the From View Id feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromViewIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationRuleType_fromViewId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationRuleType_fromViewId_feature", "_UI_NavigationRuleType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NavigationRuleType.class)) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-            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__NAVIGATION_CASE:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 1fea595..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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>";
-	}
-
-	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/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 aff050d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((PhaseListenerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PhaseListenerType_type") :
-            getString("_UI_PhaseListenerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-			}
-
-			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 13c2225..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 ab058b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.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.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.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.FacesConfigPlugin;
-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";
-
-    /**
-     * 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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyExtensionType_type") :
-            getString("_UI_PropertyExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 ecfe1a9..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 5f29fe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((PropertyResolverType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyResolverType_type") :
-            getString("_UI_PropertyResolverType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 3158621..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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);
-
-            addPropertyNamePropertyDescriptor(object);
-            addPropertyClassPropertyDescriptor(object);
-            addDefaultValuePropertyDescriptor(object);
-            addSuggestedValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Property Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_propertyName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_propertyName_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Property Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_propertyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_propertyClass_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Default Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addDefaultValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_defaultValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_defaultValue_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Suggested Value feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSuggestedValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_suggestedValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_suggestedValue_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE,
-                 true,
-                 false,
-                 false,
-                 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_PropertyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_id_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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_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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyType_type") :
-            getString("_UI_PropertyType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PropertyType.class)) {
-            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__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_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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_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
-					.getPropertyName().getTextContent();
-		case 1:
-			return property.getPropertyClass() == null ? "" : property
-					.getPropertyClass().getTextContent();
-		case 2:
-			return property.getDefaultValue() == null ? "" : property
-					.getDefaultValue().getTextContent();
-		case 3:
-			return property.getSuggestedValue() == null ? "" : property
-					.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 fab4ff5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.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.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
- */
-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";
-
-    /**
-     * 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);
-        }
-        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 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RedirectType.class)) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 3cec112..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 3448ae1..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 6ec8d87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-
-            addReferencedBeanNamePropertyDescriptor(object);
-            addReferencedBeanClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Referenced Bean Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addReferencedBeanNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanType_referencedBeanName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_referencedBeanName_feature", "_UI_ReferencedBeanType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Referenced Bean Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addReferencedBeanClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanType_referencedBeanClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_referencedBeanClass_feature", "_UI_ReferencedBeanType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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);
-        }
-        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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ReferencedBeanType.class)) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_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:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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()));
-    }
-
-    /**
-     * 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 9d31620..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 668eaa4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 4f3f0b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitFactoryType_type") :
-            getString("_UI_RenderKitFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-			}
-
-			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 2489fae..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 0c1d4c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-	/**
-	 * 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);
-
-            addRenderKitIdPropertyDescriptor(object);
-            addRenderKitClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Render Kit Id feature. 
-	 * 
-	 * <!--begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addRenderKitIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitType_renderKitId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_renderKitId_feature", "_UI_RenderKitType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Render Kit Class feature. 
-	 * 
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addRenderKitClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitType_renderKitClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_renderKitClass_feature", "_UI_RenderKitType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitType_type") :
-            getString("_UI_RenderKitType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RenderKitType.class)) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_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__RENDERER:
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__RENDERER,
-                 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-        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
-					.getRenderKitClass().getTextContent();
-		}
-		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 7738621..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 2d3787a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.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.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.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.FacesConfigPlugin;
-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";
-
-    /**
-     * 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
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RendererExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RendererExtensionType_type") :
-            getString("_UI_RendererExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 daf6a35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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);
-
-            addComponentFamilyPropertyDescriptor(object);
-            addRendererTypePropertyDescriptor(object);
-            addRendererClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Component Family feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addComponentFamilyPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_componentFamily_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_componentFamily_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Renderer Type feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addRendererTypePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_rendererType_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_rendererType_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Renderer Class feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addRendererClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_rendererClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_rendererClass_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RendererType.class)) {
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_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__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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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 ? ""
-					: ((DisplayNameType) renderer.getDisplayName().get(0)).getTextContent();
-		case 1:
-			return renderer.getComponentFamily() == null ? ""
-					: renderer.getComponentFamily().getTextContent();
-		case 2:
-			return renderer.getRendererType()==null  ? ""
-					: renderer.getRendererType().getTextContent();
-		case 3:
-			return renderer.getRendererClass() == null ? "" : renderer
-					.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 84a35ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 ? ""
-					: (String) renderer.getDisplayName().get(0);
-		case 1:
-			return renderer.getRendererClass() == null ? "" : renderer
-					.getRendererClass().getTextContent();
-		case 2:
-			return renderer.getComponentFamily().getTextContent() == null ? ""
-					: renderer.getComponentFamily().getTextContent();
-		case 3:
-			return renderer.getRendererType().getTextContent() == null ? ""
-					: 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 06a0f6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 c366aeb..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 973482b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((StateManagerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_StateManagerType_type") :
-            getString("_UI_StateManagerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 060d57d..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 774d17b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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") :
-            label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 e34a192..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 afb6b52..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 f57bb2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.FacesConfigPlugin;
-
-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";
-
-    /**
-     * 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
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ValidatorExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorExtensionType_type") :
-            getString("_UI_ValidatorExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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/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 447646c..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 7a729cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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
- */
-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";
-
-	/**
-	 * 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);
-
-            addValidatorIdPropertyDescriptor(object);
-            addValidatorClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Validator Id feature. 
-	 * 
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addValidatorIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorType_validatorId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_validatorId_feature", "_UI_ValidatorType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Validator Class feature. 
-	 * 
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addValidatorClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorType_validatorClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_validatorClass_feature", "_UI_ValidatorType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS,
-                 true,
-                 false,
-                 false,
-                 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_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(Object)} 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(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- 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__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
-     */
-	public String getText(Object object) {
-        String label = ((ValidatorType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorType_type") :
-            getString("_UI_ValidatorType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValidatorType.class)) {
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_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__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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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__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) {
-		ValidatorType validator = (ValidatorType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return validator.getValidatorClass() == null ? "" : validator
-					.getValidatorClass().getTextContent();
-		}
-		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 b9b2a87..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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 fb258c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 14dac65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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";
-
-    /**
-     * 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(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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 4d5b9c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((VariableResolverType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_VariableResolverType_type") :
-            getString("_UI_VariableResolverType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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 4a382b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.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.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
- */
-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";
-
-	/**
-	 * 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
-     */
-	public String getText(Object object) {
-        String label = ((ViewHandlerType)object).getTextContent();
-        return (label == null || label.trim().length() == 0) ?
-            getString("_UI_ViewHandlerType_type") :
-            label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- 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 to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of 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");
-		}
-
-		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/ActionListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
deleted file mode 100644
index 1cd8da8..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";
-
-    /**
-     * 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 52d1767..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";
-
-} // 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 e8ee002..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";
-
-    /**
-     * 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 0d821f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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#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#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</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#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</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";
-
-    /**
-     * 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>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();
-
-} // 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 a475d58..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";
-
-    /**
-     * 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 ca7a3a8..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";
-
-} // 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 faf77fa..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";
-
-    /**
-     * 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 240ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 744cdb8..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";
-
-    /**
-     * 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/ComponentClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
deleted file mode 100644
index c8f27a8..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";
-
-    /**
-     * 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 b411123..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";
-
-} // 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 1a6d729..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";
-
-    /**
-     * 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 9d00c3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 f040c18..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";
-
-    /**
-     * 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 3c8a082..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";
-
-    /**
-     * 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 de8df31..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";
-
-} // 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 9865d29..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";
-
-    /**
-     * 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 f52a97b..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";
-
-    /**
-     * 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 c3586a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 0f9e244..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";
-
-    /**
-     * 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 9f5b875..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";
-
-    /**
-     * 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/DefaultValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
deleted file mode 100644
index d3f9c37..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";
-
-    /**
-     * 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 5ed46d0..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";
-
-    /**
-     * 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 cc8a279..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";
-
-    /**
-     * 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 6ceae10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
+++ /dev/null
@@ -1,2589 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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#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#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#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#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#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#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#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#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#getSmallIcon <em>Small Icon</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#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#getViewHandler <em>View Handler</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";
-
-    /**
-     * 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>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>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 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>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>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>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>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>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>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>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>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 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);
-
-} // 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 12107dd..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";
-
-    /**
-     * 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 987fa6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 f1c3898..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";
-
-    /**
-     * 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/ExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
deleted file mode 100644
index f371513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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/FacesConfigExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
deleted file mode 100644
index 3a3301e..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";
-
-} // 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 78a19ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
+++ /dev/null
@@ -1,913 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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>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>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 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>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>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>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>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>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>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>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>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>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 3aed13d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
+++ /dev/null
@@ -1,14909 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNAME = "facesconfig";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNS_PREFIX = "facesconfig";
-
-    /**
-     * 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.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 = 0;
-
-    /**
-     * 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 = 1;
-
-    /**
-     * 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 = 2;
-
-    /**
-     * 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>Property Resolver</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__PROPERTY_RESOLVER = 6;
-
-    /**
-     * 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 = 7;
-
-    /**
-     * 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 = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__ID = 9;
-
-    /**
-     * 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 = 10;
-
-    /**
-     * 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 = 11;
-
-    /**
-     * 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 = 12;
-
-    /**
-     * 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 = 13;
-
-    /**
-     * 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 = 3;
-
-    /**
-     * 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 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 = 4;
-
-    /**
-     * 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 = 5;
-
-    /**
-     * 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 = 6;
-
-    /**
-     * 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 = 7;
-
-    /**
-     * 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 = 83;
-
-    /**
-     * 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 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 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 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 = 8;
-
-    /**
-     * 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 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 = 9;
-
-    /**
-     * 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 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 = 10;
-
-    /**
-     * 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 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 = 11;
-
-    /**
-     * 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 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 = 12;
-
-    /**
-     * 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 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 = 13;
-
-    /**
-     * 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 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 = 14;
-
-    /**
-     * 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 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 = 15;
-
-    /**
-     * 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.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 = 16;
-
-    /**
-     * 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 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 = 17;
-
-    /**
-     * 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 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 = 18;
-
-    /**
-     * 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 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 = 19;
-
-    /**
-     * 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 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 = 20;
-
-    /**
-     * 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 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 = 21;
-
-    /**
-     * 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>Action Listener</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ACTION_LISTENER = 3;
-
-    /**
-     * The feature id for the '<em><b>Application</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__APPLICATION = 4;
-
-    /**
-     * 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 = 5;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ATTRIBUTE = 6;
-
-    /**
-     * 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 = 7;
-
-    /**
-     * 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 = 8;
-
-    /**
-     * 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 = 9;
-
-    /**
-     * The feature id for the '<em><b>Component</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT = 10;
-
-    /**
-     * 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 = 11;
-
-    /**
-     * 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 = 12;
-
-    /**
-     * 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 = 13;
-
-    /**
-     * 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 = 14;
-
-    /**
-     * The feature id for the '<em><b>Converter</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__CONVERTER = 15;
-
-    /**
-     * 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 = 16;
-
-    /**
-     * 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 = 17;
-
-    /**
-     * 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 = 18;
-
-    /**
-     * 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 = 19;
-
-    /**
-     * 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 = 20;
-
-    /**
-     * 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 = 21;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DESCRIPTION = 22;
-
-    /**
-     * 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 = 23;
-
-    /**
-     * 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 = 24;
-
-    /**
-     * 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 = 25;
-
-    /**
-     * The feature id for the '<em><b>Facet</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACET = 26;
-
-    /**
-     * 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 = 27;
-
-    /**
-     * 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 = 28;
-
-    /**
-     * The feature id for the '<em><b>Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACTORY = 29;
-
-    /**
-     * 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 = 30;
-
-    /**
-     * 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 = 31;
-
-    /**
-     * 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 = 32;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ICON = 33;
-
-    /**
-     * The feature id for the '<em><b>Key</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__KEY = 34;
-
-    /**
-     * 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 = 35;
-
-    /**
-     * 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 = 36;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LIFECYCLE = 37;
-
-    /**
-     * 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 = 38;
-
-    /**
-     * 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 = 39;
-
-    /**
-     * 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 = 40;
-
-    /**
-     * 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 = 41;
-
-    /**
-     * 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 = 42;
-
-    /**
-     * 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 = 43;
-
-    /**
-     * 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 = 44;
-
-    /**
-     * 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 = 45;
-
-    /**
-     * 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 = 46;
-
-    /**
-     * 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 = 47;
-
-    /**
-     * 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 = 48;
-
-    /**
-     * 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 = 49;
-
-    /**
-     * 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 = 50;
-
-    /**
-     * 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 = 51;
-
-    /**
-     * 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 = 52;
-
-    /**
-     * 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 = 53;
-
-    /**
-     * The feature id for the '<em><b>Property</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY = 54;
-
-    /**
-     * 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 = 55;
-
-    /**
-     * 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 = 56;
-
-    /**
-     * 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 = 57;
-
-    /**
-     * 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 = 58;
-
-    /**
-     * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__REDIRECT = 59;
-
-    /**
-     * 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 = 60;
-
-    /**
-     * 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 = 61;
-
-    /**
-     * 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 = 62;
-
-    /**
-     * The feature id for the '<em><b>Renderer</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDERER = 63;
-
-    /**
-     * 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 = 64;
-
-    /**
-     * 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 = 65;
-
-    /**
-     * 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 = 66;
-
-    /**
-     * 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 = 67;
-
-    /**
-     * 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 = 68;
-
-    /**
-     * 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 = 69;
-
-    /**
-     * 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 = 70;
-
-    /**
-     * 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 = 71;
-
-    /**
-     * 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 = 72;
-
-    /**
-     * 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 = 73;
-
-    /**
-     * 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 = 74;
-
-    /**
-     * 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 = 75;
-
-    /**
-     * The feature id for the '<em><b>Validator</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALIDATOR = 76;
-
-    /**
-     * 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 = 77;
-
-    /**
-     * 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 = 78;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALUE = 79;
-
-    /**
-     * 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 = 80;
-
-    /**
-     * 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 = 81;
-
-    /**
-     * 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 = 82;
-
-    /**
-     * 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 = 83;
-
-    /**
-     * 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 = 22;
-
-    /**
-     * 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 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 = 23;
-
-    /**
-     * 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 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 = 86;
-
-    /**
-     * 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 = 24;
-
-    /**
-     * 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>Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__FACTORY = 1;
-
-    /**
-     * 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 = 2;
-
-    /**
-     * 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 = 3;
-
-    /**
-     * 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 = 4;
-
-    /**
-     * 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 = 5;
-
-    /**
-     * 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 = 6;
-
-    /**
-     * 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 = 7;
-
-    /**
-     * 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 = 8;
-
-    /**
-     * 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 = 9;
-
-    /**
-     * 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 = 10;
-
-    /**
-     * The feature id for the '<em><b>Xmlns</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__XMLNS = 11;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__ID = 12;
-
-    /**
-     * 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 = 13;
-
-    /**
-     * 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 = 25;
-
-    /**
-     * 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 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 = 26;
-
-    /**
-     * 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 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 = 27;
-
-    /**
-     * 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 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 = 28;
-
-    /**
-     * 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 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 = 29;
-
-    /**
-     * 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>Faces Context Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__FACES_CONTEXT_FACTORY = 1;
-
-    /**
-     * 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 = 2;
-
-    /**
-     * 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 = 3;
-
-    /**
-     * 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 = 4;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__ID = 5;
-
-    /**
-     * 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 = 6;
-
-    /**
-     * 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 = 30;
-
-    /**
-     * 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 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 = 31;
-
-    /**
-     * 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 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 = 32;
-
-    /**
-     * 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 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 = 33;
-
-    /**
-     * 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 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 = 34;
-
-    /**
-     * 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 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 = 35;
-
-    /**
-     * 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 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 = 36;
-
-    /**
-     * 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 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 = 37;
-
-    /**
-     * 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 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 = 38;
-
-    /**
-     * 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 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 = 39;
-
-    /**
-     * 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 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 = 40;
-
-    /**
-     * 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 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 = 41;
-
-    /**
-     * 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 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 = 42;
-
-    /**
-     * 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 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 = 43;
-
-    /**
-     * 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 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 = 44;
-
-    /**
-     * 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 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 = 11;
-
-    /**
-     * 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 = 45;
-
-    /**
-     * 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 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 = 46;
-
-    /**
-     * 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 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 = 47;
-
-    /**
-     * 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 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 = 48;
-
-    /**
-     * 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 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 = 49;
-
-    /**
-     * 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>To View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__TO_VIEW_ID = 5;
-
-    /**
-     * 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 = 6;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__ID = 7;
-
-    /**
-     * 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 = 8;
-
-    /**
-     * 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 = 50;
-
-    /**
-     * 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 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 = 51;
-
-    /**
-     * 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.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 = 52;
-
-    /**
-     * 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 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 = 53;
-
-    /**
-     * 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 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 = 54;
-
-    /**
-     * 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 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 = 55;
-
-    /**
-     * 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 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 = 56;
-
-    /**
-     * 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 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 = 57;
-
-    /**
-     * 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 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 = 58;
-
-    /**
-     * 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 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 = 59;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REDIRECT_TYPE__ID = 0;
-
-    /**
-     * 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 = 1;
-
-    /**
-     * 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 = 60;
-
-    /**
-     * 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 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 = 61;
-
-    /**
-     * 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 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 = 62;
-
-    /**
-     * 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 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 = 63;
-
-    /**
-     * 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 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 = 64;
-
-    /**
-     * 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 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 = 65;
-
-    /**
-     * 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 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 = 66;
-
-    /**
-     * 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 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 = 67;
-
-    /**
-     * 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 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 = 68;
-
-    /**
-     * 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 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 = 69;
-
-    /**
-     * 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 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 = 70;
-
-    /**
-     * 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>Render Kit Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = 6;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__ID = 7;
-
-    /**
-     * 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 = 8;
-
-    /**
-     * 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 = 71;
-
-    /**
-     * 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 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 = 72;
-
-    /**
-     * 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 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 = 73;
-
-    /**
-     * 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 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 = 74;
-
-    /**
-     * 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 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 = 75;
-
-    /**
-     * 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 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 = 76;
-
-    /**
-     * 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 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 = 77;
-
-    /**
-     * 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 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 = 78;
-
-    /**
-     * 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 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 = 79;
-
-    /**
-     * 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 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 = 80;
-
-    /**
-     * 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 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 = 81;
-
-    /**
-     * 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 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 = 82;
-
-    /**
-     * 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 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 = 84;
-
-    /**
-     * 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 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 = 93;
-
-    /**
-     * 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 = 94;
-
-    /**
-     * 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 = 95;
-
-    /**
-     * 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 = 87;
-
-    /**
-     * 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 = 88;
-
-    /**
-     * 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 = 89;
-
-    /**
-     * 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 = 85;
-
-    /**
-     * 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 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 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>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>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 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 = 90;
-
-    /**
-     * 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 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 = 91;
-
-    /**
-     * 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 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 = 92;
-
-    /**
-     * 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>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 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 = 96;
-
-    /**
-     * 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;
-
-
-    /**
-     * 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#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 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.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.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#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#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#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#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#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#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#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#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#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#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#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#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 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 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#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 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 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 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#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#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#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 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.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 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.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#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.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 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 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#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.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.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.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.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.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.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>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 '{@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.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.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>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>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 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>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>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>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>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>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>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>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>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 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 '{@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 '<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>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>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>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 '{@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>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>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>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>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.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 '{@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.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>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.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>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 '{@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>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.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.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.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.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.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 bba784f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.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;
-
-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#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#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#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>
- * </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";
-
-    /**
-     * 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>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>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>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);
-
-} // 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 b25a431..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";
-
-    /**
-     * 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 7016d15..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";
-
-} // 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 f56bfa6..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";
-
-    /**
-     * 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 1c663a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 03c58c1..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";
-
-} // 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 80bdca5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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#getFacesContextFactory <em>Faces 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#getRenderKitFactory <em>Render Kit 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";
-
-    /**
-     * 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>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>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>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>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 4bb8a75..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";
-
-    /**
-     * 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 5fafeed..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";
-
-    /**
-     * 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 7e325c1..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";
-
-    /**
-     * 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 1fe0d38..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";
-
-    /**
-     * 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/KeyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
deleted file mode 100644
index da97328..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";
-
-    /**
-     * 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 806114c..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";
-
-    /**
-     * 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 dcc6c75..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";
-
-    /**
-     * 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 6249588..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";
-
-} // 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 df6c57c..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";
-
-    /**
-     * 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 0126ee6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 2c65fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.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
- *   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";
-
-    /**
-     * 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 45f038d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.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
- *   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";
-
-    /**
-     * 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 3d38362..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";
-
-    /**
-     * 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 21e7f12..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";
-
-} // 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 a845c56..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";
-
-    /**
-     * 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 f15180c..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";
-
-    /**
-     * 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 81a4b34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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>
- * </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";
-
-    /**
-     * 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);
-
-} // 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 5889de0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.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.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";
-
-    /**
-     * 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 6b22f52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 d3fa8bf..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";
-
-    /**
-     * 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 ae1048e..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";
-
-    /**
-     * 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/NavigationCaseType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
deleted file mode 100644
index 9dba0d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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#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";
-
-    /**
-     * 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>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 228d5bf..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";
-
-    /**
-     * 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 02b84da..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";
-
-} // 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 d9e5654..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 1641bda..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";
-
-    /**
-     * 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/PhaseListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
deleted file mode 100644
index de99f00..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";
-
-    /**
-     * 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 e739b88..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";
-
-    /**
-     * 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 59a429c..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";
-
-} // 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 69fff56..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";
-
-    /**
-     * 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 4547566..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";
-
-    /**
-     * 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 297588e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 248986b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.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>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</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";
-
-    /**
-     * 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);
-
-} // RedirectType
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 cd9f458..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";
-
-    /**
-     * 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 c31a6e9..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";
-
-    /**
-     * 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 5754419..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.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.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";
-
-    /**
-     * 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 46e5063..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";
-
-    /**
-     * 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 f6b42f8..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";
-
-} // 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 ef52546..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";
-
-    /**
-     * 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 042654c..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";
-
-    /**
-     * 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 b6656d6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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#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";
-
-    /**
-     * 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>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 f4948e5..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";
-
-    /**
-     * 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 7cb1800..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";
-
-} // 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 38cb43c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 94adcc5..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";
-
-    /**
-     * 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 749b68f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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/SmallIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
deleted file mode 100644
index 02537c9..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";
-
-    /**
-     * 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/StateManagerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
deleted file mode 100644
index c90f4cc..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";
-
-    /**
-     * 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 755c6fb..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";
-
-    /**
-     * 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 ebeeb2a..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";
-
-    /**
-     * 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/ToViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
deleted file mode 100644
index 11756a3..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";
-
-    /**
-     * 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 2802e71..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";
-
-    /**
-     * 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 98c7646..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";
-
-} // 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 12cbb9d..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";
-
-    /**
-     * 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 3c63322..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.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.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";
-
-    /**
-     * 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 a972f2d..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";
-
-    /**
-     * 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 c8452aa..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";
-
-    /**
-     * 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 354057b..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";
-
-    /**
-     * 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 2eda6f2..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";
-
-    /**
-     * 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/ViewHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
deleted file mode 100644
index 1f127b8..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";
-
-    /**
-     * 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/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 aa93c6e..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 7074886..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 18f0992..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 d87310a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
+++ /dev/null
@@ -1,628 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.StateManagerType;
-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#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#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getId <em>Id</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#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getApplicationExtension <em>Application Extension</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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 #getELResolver() <em>EL Resolver</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getELResolver()
-     * @generated
-     * @ordered
-     */
-    protected EList eLResolver = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * <!-- 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 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 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__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__PROPERTY_RESOLVER:
-                return getPropertyResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                return getVariableResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                return getLocaleConfig();
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                return getId();
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                return getELResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                return getResourceBundle();
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                return getApplicationExtension();
-        }
-        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__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__LOCALE_CONFIG:
-                getLocaleConfig().clear();
-                getLocaleConfig().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                setId((String)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                getELResolver().clear();
-                getELResolver().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;
-        }
-        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__PROPERTY_RESOLVER:
-                getPropertyResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                getVariableResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                getLocaleConfig().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                getELResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                getResourceBundle().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                getApplicationExtension().clear();
-                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__PROPERTY_RESOLVER:
-                return propertyResolver != null && !propertyResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                return variableResolver != null && !variableResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                return localeConfig != null && !localeConfig.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                return eLResolver != null && !eLResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                return resourceBundle != null && !resourceBundle.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                return applicationExtension != null && !applicationExtension.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: ");
-        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 570b872..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 6160573..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";
-
-    /**
-     * <!-- 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 3a8f646..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 1e51f42..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 81306e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 ae23566..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 d3ca134..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";
-
-    /**
-     * <!-- 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 6f318f0..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 b9c3f17..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 c9851d3..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 3b6bbce..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 ba8b1ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 446f429..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 68dc44f..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 24df9d4..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 -->
-	 * <!-- end-user-doc -->
-     * @param newConverterClass 
-     * @param msgs 
-     * @return the notification chain 
-     * @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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 97409c0..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 3269529..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 243d213..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 35765f7..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        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 5dfd498..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        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 5379a84..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,3766 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-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.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-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.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-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.DocumentRoot;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-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.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-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.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-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.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-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;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-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.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-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>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#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#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#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#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#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#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#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#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#getSmallIcon <em>Small Icon</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#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#getViewHandler <em>View Handler</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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * <!-- 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 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 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 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 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 -->
-	 * <!-- end-user-doc -->
-     * @param newFacesContextFactory 
-     * @param msgs 
-     * @return the notification chain
-     * @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 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 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 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 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 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 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 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 -->
-	 * <!-- end-user-doc -->
-     * @param newValidatorClass 
-     * @param msgs 
-     * @return the notification chain
-     * @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 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 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__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__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_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__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__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__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__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__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__SMALL_ICON:
-                return basicSetSmallIcon(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__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_HANDLER:
-                return basicSetViewHandler(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__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__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_VALUE:
-                return getDefaultValue();
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                return getDisplayName();
-            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__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__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__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__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__SMALL_ICON:
-                return getSmallIcon();
-            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__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_HANDLER:
-                return getViewHandler();
-        }
-        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__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__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_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__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__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__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__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__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__SMALL_ICON:
-                setSmallIcon((SmallIconType)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__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_HANDLER:
-                setViewHandler((ViewHandlerType)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__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__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_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__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__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__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__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__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__SMALL_ICON:
-                setSmallIcon((SmallIconType)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__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_HANDLER:
-                setViewHandler((ViewHandlerType)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__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__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_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__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__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__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__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__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__SMALL_ICON:
-                return getSmallIcon() != 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__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_HANDLER:
-                return getViewHandler() != 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(" (mixed: ");
-        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 3a32acb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: ");
-        result.append(name);
-        result.append(", value: ");
-        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 97827b6..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: ");
-        result.append(name);
-        result.append(", textContent: ");
-        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 fbcd77b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 7aa18d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 cda65b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 4a4683d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
+++ /dev/null
@@ -1,1157 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return the factory instance 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FacesConfigFactory init() {
-        try {
-            FacesConfigFactory theFacesConfigFactory = (FacesConfigFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"); 
-            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.ACTION_LISTENER_TYPE: return createActionListenerType();
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE: return createApplicationFactoryType();
-            case FacesConfigPackage.APPLICATION_TYPE: return createApplicationType();
-            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.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.DEFAULT_LOCALE_TYPE: return createDefaultLocaleType();
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: return createDefaultRenderKitIdType();
-            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.FACES_CONFIG_TYPE: return createFacesConfigType();
-            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.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.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.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_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.NAVIGATION_CASE_TYPE: return createNavigationCaseType();
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: return createNavigationHandlerType();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE: return createNavigationRuleType();
-            case FacesConfigPackage.NULL_VALUE_TYPE: return createNullValueType();
-            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.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.SMALL_ICON_TYPE: return createSmallIconType();
-            case FacesConfigPackage.STATE_MANAGER_TYPE: return createStateManagerType();
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE: return createSuggestedValueType();
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: return createSupportedLocaleType();
-            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.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.APPLICATION_EXTENSION_TYPE: return createApplicationExtensionType();
-            case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: return createConverterExtensionType();
-            case FacesConfigPackage.EL_RESOLVER_TYPE: return createELResolverType();
-            case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: return createFacesConfigExtensionType();
-            case FacesConfigPackage.FACTORY_EXTENSION_TYPE: return createFactoryExtensionType();
-            case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: return createLifecycleExtensionType();
-            case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: return createManagedBeanExtensionType();
-            case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: return createNavigationRuleExtensionType();
-            case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: return createValidatorExtensionType();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: return createResourceBundleType();
-            case FacesConfigPackage.BASE_NAME_TYPE: return createBaseNameType();
-            case FacesConfigPackage.VAR_TYPE: return createVarType();
-            case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: return createRenderKitExtensionType();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-        }
-    }
-
-    /**
-     * <!-- 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 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 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 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 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 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 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 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 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 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 RenderKitExtensionType createRenderKitExtensionType() {
-        RenderKitExtensionTypeImpl renderKitExtensionType = new RenderKitExtensionTypeImpl();
-        return renderKitExtensionType;
-    }
-
-    /**
-     * <!-- 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 4e358ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
+++ /dev/null
@@ -1,9838 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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
- */
-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 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 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 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 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 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 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 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 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 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 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 renderKitExtensionTypeEClass = 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 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.  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 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.getEPackage(eNS_URI) instanceof FacesConfigPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(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();
-
-        return theFacesConfigPackage;
-    }
-
-    /**
-     * <!-- 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(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_VariableResolver() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_LocaleConfig() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getApplicationType_Id() {
-        return (EAttribute)applicationTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ELResolver() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ResourceBundle() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ApplicationExtension() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- 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 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 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_ActionListener() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Application() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ApplicationFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Attribute() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Component() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentFamily() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(13);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentType() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(14);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Converter() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(15);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(16);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterForClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(17);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(18);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultLocale() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(19);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultRenderKitId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(20);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(21);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Description() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(22);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DisplayName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(23);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacesConfig() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(24);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacesContextFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(25);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Facet() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(26);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacetExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(27);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacetName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(28);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Factory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(29);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromAction() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(30);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromOutcome() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(31);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromViewId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(32);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Icon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(33);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Key() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(34);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_KeyClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(35);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LargeIcon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(36);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Lifecycle() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(37);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LifecycleFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(38);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ListEntries() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(39);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LocaleConfig() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(40);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBean() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(41);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(42);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(43);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanScope() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(44);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedProperty() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(45);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MapEntries() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(46);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MapEntry() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(47);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MessageBundle() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(48);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationCase() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(49);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationHandler() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(50);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationRule() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(51);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NullValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(52);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PhaseListener() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(53);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Property() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(54);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(55);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(56);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(57);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyResolver() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(58);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Redirect() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(59);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBean() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(60);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBeanClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(61);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBeanName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(62);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Renderer() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(63);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(64);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(65);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererType() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(66);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKit() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(67);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(68);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(69);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(70);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SmallIcon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(71);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_StateManager() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(72);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SuggestedValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(73);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SupportedLocale() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(74);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ToViewId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(75);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Validator() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(76);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValidatorClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(77);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValidatorId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(78);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Value() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(79);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValueClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(80);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_VariableResolver() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(81);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ViewHandler() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(82);
-    }
-
-    /**
-     * <!-- 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 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_Factory() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Component() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Converter() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_ManagedBean() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_NavigationRule() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_ReferencedBean() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_RenderKit() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Lifecycle() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Validator() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFacesConfigType_FacesConfigExtension() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesConfigType_Xmlns() {
-        return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesConfigType_Id() {
-        return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- 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_FacesContextFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_LifecycleFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_RenderKitFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFactoryType_FactoryExtension() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFactoryType_Id() {
-        return (EAttribute)factoryTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- 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 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 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 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_ToViewId() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_Redirect() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNavigationCaseType_Id() {
-        return (EAttribute)navigationCaseTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- 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 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 EAttribute getRedirectType_Id() {
-        return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- 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_RenderKitExtension() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitType_Id() {
-        return (EAttribute)renderKitTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- 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 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 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 getRenderKitExtensionType() {
-        return renderKitExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- 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 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
-        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__PROPERTY_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__VARIABLE_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__LOCALE_CONFIG);
-        createEAttribute(applicationTypeEClass, APPLICATION_TYPE__ID);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__EL_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_BUNDLE);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__APPLICATION_EXTENSION);
-
-        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);
-
-        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);
-
-        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);
-
-        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__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__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_VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DESCRIPTION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DISPLAY_NAME);
-        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__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__NAVIGATION_CASE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_HANDLER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_RULE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NULL_VALUE);
-        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__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__SMALL_ICON);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__STATE_MANAGER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__SUGGESTED_VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__SUPPORTED_LOCALE);
-        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_HANDLER);
-
-        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);
-
-        facesConfigTypeEClass = createEClass(FACES_CONFIG_TYPE);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__APPLICATION);
-        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__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__FACES_CONFIG_EXTENSION);
-        createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__XMLNS);
-        createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__ID);
-
-        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__FACES_CONTEXT_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__LIFECYCLE_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__RENDER_KIT_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__FACTORY_EXTENSION);
-        createEAttribute(factoryTypeEClass, FACTORY_TYPE__ID);
-
-        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);
-
-        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);
-
-        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);
-
-        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);
-
-        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__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);
-
-        nullValueTypeEClass = createEClass(NULL_VALUE_TYPE);
-        createEAttribute(nullValueTypeEClass, NULL_VALUE_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);
-        createEAttribute(redirectTypeEClass, REDIRECT_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__RENDER_KIT_EXTENSION);
-        createEAttribute(renderKitTypeEClass, RENDER_KIT_TYPE__ID);
-
-        smallIconTypeEClass = createEClass(SMALL_ICON_TYPE);
-        createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__TEXT_CONTENT);
-        createEAttribute(smallIconTypeEClass, SMALL_ICON_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);
-
-        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);
-
-        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);
-
-        extensionTypeEClass = createEClass(EXTENSION_TYPE);
-        createEReference(extensionTypeEClass, EXTENSION_TYPE__CHILD_NODES);
-        createEAttribute(extensionTypeEClass, EXTENSION_TYPE__TEXT_CONTENT);
-        createEAttribute(extensionTypeEClass, EXTENSION_TYPE__ID);
-
-        applicationExtensionTypeEClass = createEClass(APPLICATION_EXTENSION_TYPE);
-
-        converterExtensionTypeEClass = createEClass(CONVERTER_EXTENSION_TYPE);
-
-        elResolverTypeEClass = createEClass(EL_RESOLVER_TYPE);
-        createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__TEXT_CONTENT);
-        createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__ID);
-
-        facesConfigExtensionTypeEClass = createEClass(FACES_CONFIG_EXTENSION_TYPE);
-
-        factoryExtensionTypeEClass = createEClass(FACTORY_EXTENSION_TYPE);
-
-        lifecycleExtensionTypeEClass = createEClass(LIFECYCLE_EXTENSION_TYPE);
-
-        managedBeanExtensionTypeEClass = createEClass(MANAGED_BEAN_EXTENSION_TYPE);
-
-        navigationRuleExtensionTypeEClass = createEClass(NAVIGATION_RULE_EXTENSION_TYPE);
-
-        validatorExtensionTypeEClass = createEClass(VALIDATOR_EXTENSION_TYPE);
-
-        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);
-
-        renderKitExtensionTypeEClass = createEClass(RENDER_KIT_EXTENSION_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);
-
-        // Obtain other dependent packages
-        XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-        // Add supertypes to classes
-        attributeExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        componentExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        facetExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        propertyExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        rendererExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        applicationExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        converterExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        facesConfigExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        factoryExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        lifecycleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        managedBeanExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        navigationRuleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        validatorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        renderKitExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-
-        // Initialize classes and features; add operations and parameters
-        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_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_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);
-        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);
-        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_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);
-
-        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(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(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(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_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_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_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_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_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_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_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_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_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_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_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_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);
-
-        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(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_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_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_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);
-
-        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_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_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_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_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(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(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(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);
-
-        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(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_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(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(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);
-        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);
-
-        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_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(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(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(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(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(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(applicationExtensionTypeEClass, ApplicationExtensionType.class, "ApplicationExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(converterExtensionTypeEClass, ConverterExtensionType.class, "ConverterExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        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(facesConfigExtensionTypeEClass, FacesConfigExtensionType.class, "FacesConfigExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(factoryExtensionTypeEClass, FactoryExtensionType.class, "FactoryExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(lifecycleExtensionTypeEClass, LifecycleExtensionType.class, "LifecycleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(managedBeanExtensionTypeEClass, ManagedBeanExtensionType.class, "ManagedBeanExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(navigationRuleExtensionTypeEClass, NavigationRuleExtensionType.class, "NavigationRuleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(validatorExtensionTypeEClass, ValidatorExtensionType.class, "ValidatorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        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(renderKitExtensionTypeEClass, RenderKitExtensionType.class, "RenderKitExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        // 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
-          (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_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_LocaleConfig(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "locale-config",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_ELResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "el-resolver",
-             "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
-          (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
-          (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
-          (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_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_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_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_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_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_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_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_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_SmallIcon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "small-icon",
-             "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_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_ViewHandler(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "view-handler",
-             "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
-          (getExtensionType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getExtensionType_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_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_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_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
-          (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_FacesContextFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "faces-context-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_LifecycleFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_RenderKitFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-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
-          (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
-          (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
-          (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_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
-          (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_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_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
-          (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
-          (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
-          (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"
-           });
-    }
-
-} //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 2b19c98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.ApplicationType;
-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.NavigationRuleType;
-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#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#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#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>
- * </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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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";
-
-    /**
-     * 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 = false;
-
-    /**
-     * 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 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 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 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 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 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__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__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);
-        }
-        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__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__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__FACES_CONFIG_EXTENSION:
-                return getFacesConfigExtension();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                return getXmlns();
-            case FacesConfigPackage.FACES_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.FACES_CONFIG_TYPE__APPLICATION:
-                getApplication().clear();
-                getApplication().addAll((Collection)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__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__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;
-        }
-        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__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__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__FACES_CONFIG_EXTENSION:
-                getFacesConfigExtension().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                unsetXmlns();
-                return;
-            case FacesConfigPackage.FACES_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.FACES_CONFIG_TYPE__APPLICATION:
-                return application != null && !application.isEmpty();
-            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__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__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);
-        }
-        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(" (xmlns: ");
-        if (xmlnsESet) result.append(xmlns); else result.append("<unset>");
-        result.append(", id: ");
-        result.append(id);
-        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 d99fd16..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 c40e8d5..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";
-
-    /**
-     * <!-- 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 49d8fc0..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 7f10ac5..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 -->
-	 * <!-- end-user-doc -->
-     * @param newFacetName 
-     * @param msgs 
-     * @return the notification chain 
-     * @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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 d7323c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 e23c5d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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.RenderKitFactoryType;
-
-
-/**
- * <!-- 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#getFacesContextFactory <em>Faces 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#getRenderKitFactory <em>Render Kit 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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 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 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 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 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__FACES_CONTEXT_FACTORY:
-                return ((InternalEList)getFacesContextFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return ((InternalEList)getLifecycleFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return ((InternalEList)getRenderKitFactory()).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__FACES_CONTEXT_FACTORY:
-                return getFacesContextFactory();
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return getLifecycleFactory();
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return getRenderKitFactory();
-            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__FACES_CONTEXT_FACTORY:
-                getFacesContextFactory().clear();
-                getFacesContextFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                getLifecycleFactory().clear();
-                getLifecycleFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                getRenderKitFactory().clear();
-                getRenderKitFactory().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__FACES_CONTEXT_FACTORY:
-                getFacesContextFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                getLifecycleFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                getRenderKitFactory().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__FACES_CONTEXT_FACTORY:
-                return facesContextFactory != null && !facesContextFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return lifecycleFactory != null && !lifecycleFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return renderKitFactory != null && !renderKitFactory.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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 b7bad7f..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 e20b0fc..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 a7ff78b..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 9eda36b..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        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/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 2c9140a..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 20512ac..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 fd083f6..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 862733f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 e20b8a2..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 40eb56d..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 9e013de..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 1aa88d4..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 aae37fc..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 eeb3090..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 68c8746..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 2762e6a..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 a4bda90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
+++ /dev/null
@@ -1,724 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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>
- * </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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 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 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();
-        }
-        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;
-        }
-        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;
-        }
-        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);
-        }
-        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: ");
-        result.append(id);
-        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 607baed..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 00ac1ec..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 15e4128..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 743bdfd..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 e672071..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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#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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 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__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__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__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__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__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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 4c3b42d..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 efd8e32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 63edf76..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 3923660..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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/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 b4c8a0d..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 d2ae3fc..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 40ebf97..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";
-
-    /**
-     * <!-- 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 f6deab3..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 30b564f..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 b363155..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 063db6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.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.RedirectType;
-
-
-/**
- * <!-- 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#getId <em>Id</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";
-
-    /**
-     * 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 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 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 Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.REDIRECT_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_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_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_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        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: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RedirectTypeImpl
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 dd851ea..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 d24ae6d..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 83e7415..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 25df611..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 d73ba4c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 ca71db5..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 5b25b96..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 65f84aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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.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#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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 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__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__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__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__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__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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 b3949ab..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 3311bbd..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";
-
-    /**
-     * <!-- 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 c1baf80..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 a42393b..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 1766c06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * The cached value of the '{@link #getVar() <em>Var</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getVar()
-     * @generated
-     * @ordered
-     */
-    protected VarType var = null;
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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/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 6b2621e..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 0b7d605..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 ea41fd4..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 85fe6be..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 56e3915..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 f378cac..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 1e4a3e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.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.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";
-
-    /**
-     * <!-- 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 281de13..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 54ae5f8..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";
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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 = null;
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        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 2285d57..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 a155a50..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 4ffed3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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 484d941..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 d56647d..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";
-
-    /**
-     * 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
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        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/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 b063887..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
+++ /dev/null
@@ -1,1764 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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 the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesConfigSwitch modelSwitch =
-        new FacesConfigSwitch() {
-            public Object caseActionListenerType(ActionListenerType object) {
-                return createActionListenerTypeAdapter();
-            }
-            public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-                return createApplicationFactoryTypeAdapter();
-            }
-            public Object caseApplicationType(ApplicationType object) {
-                return createApplicationTypeAdapter();
-            }
-            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 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 caseDefaultLocaleType(DefaultLocaleType object) {
-                return createDefaultLocaleTypeAdapter();
-            }
-            public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-                return createDefaultRenderKitIdTypeAdapter();
-            }
-            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 caseFacesConfigType(FacesConfigType object) {
-                return createFacesConfigTypeAdapter();
-            }
-            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 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 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 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 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 caseNavigationCaseType(NavigationCaseType object) {
-                return createNavigationCaseTypeAdapter();
-            }
-            public Object caseNavigationHandlerType(NavigationHandlerType object) {
-                return createNavigationHandlerTypeAdapter();
-            }
-            public Object caseNavigationRuleType(NavigationRuleType object) {
-                return createNavigationRuleTypeAdapter();
-            }
-            public Object caseNullValueType(NullValueType object) {
-                return createNullValueTypeAdapter();
-            }
-            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 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 caseSmallIconType(SmallIconType object) {
-                return createSmallIconTypeAdapter();
-            }
-            public Object caseStateManagerType(StateManagerType object) {
-                return createStateManagerTypeAdapter();
-            }
-            public Object caseSuggestedValueType(SuggestedValueType object) {
-                return createSuggestedValueTypeAdapter();
-            }
-            public Object caseSupportedLocaleType(SupportedLocaleType object) {
-                return createSupportedLocaleTypeAdapter();
-            }
-            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 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 caseExtensionType(ExtensionType object) {
-                return createExtensionTypeAdapter();
-            }
-            public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-                return createApplicationExtensionTypeAdapter();
-            }
-            public Object caseConverterExtensionType(ConverterExtensionType object) {
-                return createConverterExtensionTypeAdapter();
-            }
-            public Object caseELResolverType(ELResolverType object) {
-                return createELResolverTypeAdapter();
-            }
-            public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-                return createFacesConfigExtensionTypeAdapter();
-            }
-            public Object caseFactoryExtensionType(FactoryExtensionType object) {
-                return createFactoryExtensionTypeAdapter();
-            }
-            public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-                return createLifecycleExtensionTypeAdapter();
-            }
-            public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-                return createManagedBeanExtensionTypeAdapter();
-            }
-            public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-                return createNavigationRuleExtensionTypeAdapter();
-            }
-            public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-                return createValidatorExtensionTypeAdapter();
-            }
-            public Object caseResourceBundleType(ResourceBundleType object) {
-                return createResourceBundleTypeAdapter();
-            }
-            public Object caseBaseNameType(BaseNameType object) {
-                return createBaseNameTypeAdapter();
-            }
-            public Object caseVarType(VarType object) {
-                return createVarTypeAdapter();
-            }
-            public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-                return createRenderKitExtensionTypeAdapter();
-            }
-            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.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.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.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.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.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.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.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.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.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.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.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.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.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 02b8f45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
+++ /dev/null
@@ -1,2175 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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";
-
-    /**
-     * 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
-     */
-	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 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.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.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.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_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.FACES_CONFIG_TYPE: {
-                FacesConfigType facesConfigType = (FacesConfigType)theEObject;
-                Object result = caseFacesConfigType(facesConfigType);
-                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.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.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.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_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.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.NULL_VALUE_TYPE: {
-                NullValueType nullValueType = (NullValueType)theEObject;
-                Object result = caseNullValueType(nullValueType);
-                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.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.SMALL_ICON_TYPE: {
-                SmallIconType smallIconType = (SmallIconType)theEObject;
-                Object result = caseSmallIconType(smallIconType);
-                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.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.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.EXTENSION_TYPE: {
-                ExtensionType extensionType = (ExtensionType)theEObject;
-                Object result = caseExtensionType(extensionType);
-                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.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.EL_RESOLVER_TYPE: {
-                ELResolverType elResolverType = (ELResolverType)theEObject;
-                Object result = caseELResolverType(elResolverType);
-                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.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.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.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.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.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.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.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;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 interpretting 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 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;
-    }
-
-} //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 01ba896..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(": ");
-			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/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 cf8d226..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.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 ActionListenerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ActionListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);//$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 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 75981f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.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 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 4a3fb53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.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 - 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-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 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 ViewHandlerTranslator("view-handler", facesPackage.getApplicationType_ViewHandler()), //$NON-NLS-1$
-				new StateManagerTranslator("state-manager", facesPackage.getApplicationType_StateManager()), //$NON-NLS-1$
-				new PropertyResolverTranslator("property-resolver", facesPackage.getApplicationType_PropertyResolver()), //$NON-NLS-1$
-				new VariableResolverTranslator("variable-resolver", facesPackage.getApplicationType_VariableResolver()), //$NON-NLS-1$
-				new LocaleConfigTranslator("locale-config", facesPackage.getApplicationType_LocaleConfig()), //$NON-NLS-1$
-                new ELResolverTypeTranslator("el-resolver", facesPackage.getApplicationType_ELResolver()),
-                new ResourceBundleTranslator("resource-bundle", facesPackage.getApplicationType_ResourceBundle()),
-                new ApplicationExtensionTranslator("application-extension", facesPackage.getApplicationType_ApplicationExtension()),
-				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 b9d7411..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);//$NON-NLS-1$
-	}
-}
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 91b1a2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.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 - 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/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 9f25e02..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-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 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 433eb39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.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 - 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-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 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 a07853b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.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 DefaultRenderKitIdTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultRenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT); //$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 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/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 fae3f92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.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 - 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 48c7563..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 4254f25..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()),
-            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 : "";
-                }
-            }
-        };
-    }
-
-    /**
-     * @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 "";
-    }
-
-    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/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 8368b97..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())
-        };
-    }
-}
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 3cfb5d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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.Translator;
-import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
-
-/**
- * @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 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 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 FacesConfigExtensionTranslator("faces-config-extension", facesPackage.getFacesConfigType_FacesConfigExtension()), //$NON_NLS-1$
-				new Translator("xmlns", facesPackage.getFacesConfigType_Xmlns(), 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 4beae72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 659545f..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); //$NON-NLS-1$
-	}
-}
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 aea013b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.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 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 d178277..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.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 - 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 FacesContextFactoryTranslator("faces-context-factory", facesPackage.getFactoryType_FacesContextFactory()), //$NON-NLS-1$
-			new LifecycleFactoryTranslator("lifecycle-factory", facesPackage.getFactoryType_LifecycleFactory()), //$NON-NLS-1$
-			new RenderKitFactoryTranslator("render-kit-factory", facesPackage.getFactoryType_RenderKitFactory()), //$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 add34b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.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 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/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 b01b5fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.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 - 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 0fd0e95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.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 - 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()),
-			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 d7027df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.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 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 26e8075..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 b65ccab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.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 - 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("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 85da11e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.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 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 a1b16fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.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 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 1dc3ebb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.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 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 b4f06fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.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 - 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/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 50dc244..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.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 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 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 b115985..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.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 - 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-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 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 b6c261e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.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 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/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 5acfadf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.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 - 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 9e4a036..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.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 - 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 060a697..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.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 - 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 29b73b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.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.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 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/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 7e654de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.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 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 e5e867c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.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 - 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 eca2dec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.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 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 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 05213fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.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 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/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/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 ee85c49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.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 - 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 f8df850..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.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 - 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/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 d47b5f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.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 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 23769a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.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 - 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 3a808cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.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 - 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/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 1d43ee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.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 - 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/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 89e3409..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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.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 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);
-	}
-
-	/**
-	 * @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() {
-		List contents = getDeploymentDescriptorResource().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
-	 */
-	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);
-		}
-		return getArtifactEditModel().getResource(facesConfigURI);
-	}
-
-	/**
-	 * 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;
-	}
-
-	// 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).
-		IFacesConfigResource resource = (IFacesConfigResource)getDeploymentDescriptorResource();
-		if (resource != null) {
-			EMF2DOMSSERenderer renderer = (EMF2DOMSSERenderer) 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 b452d3b..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)); //$NON-NLS-1$
-		} 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 e2422d3..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";
-
-	/**
-	 * 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()))
-			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 3ef5323..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());
-
-		// 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);
-			}
-		}
-	}
-
-	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");
-			return;
-		}
-
-		// Make the Struts config. editor the default.
-		traceFiner(file, "Unsetting.");
-		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);
-	}
-
-	/** @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/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_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_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_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_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/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_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_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/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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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/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_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_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_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_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_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_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/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_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_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_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/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/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_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_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/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_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/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_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/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/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_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_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_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_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/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/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_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/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/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/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/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/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/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/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/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/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/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/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/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/model/FacesConfig.ecore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
deleted file mode 100644
index 2cc5942..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
+++ /dev/null
@@ -1,3793 +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="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="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="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: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: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="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>
-  </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="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="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="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="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="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="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="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="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="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="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="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="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="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="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>
-  </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="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="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="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="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="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>
-  </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="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="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="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="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="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>
-  </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="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="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="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: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="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="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="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="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>
-</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 aece538..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
+++ /dev/null
@@ -1,576 +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#//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/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/stateManager"/>
-      <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/localeConfig"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationType/id"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/eLResolver"/>
-      <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"/>
-    </genClasses>
-    <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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/defaultValue"/>
-      <genFeatures createChild="false" 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#//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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterForClass"/>
-      <genFeatures createChild="false" 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#//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#//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" children="true" createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/actionListener"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/application"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/applicationFactory"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attribute"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeExtension"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/component"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentFamily"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentType"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converter"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterForClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultLocale"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultRenderKitId"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/description"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/displayName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesConfig"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesContextFactory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facet"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/factory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromAction"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromOutcome"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromViewId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/icon"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/key"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/keyClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/largeIcon"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycle"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycleFactory"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/listEntries"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/localeConfig"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBean"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanName"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanScope"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedProperty"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntries"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntry"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/messageBundle"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationCase"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationHandler"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationRule"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/nullValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/phaseListener"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/property"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyResolver"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirect"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBean"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderer"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererType"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKit"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitFactory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitId"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/smallIcon"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/stateManager"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/suggestedValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/supportedLocale"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/toViewId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validator"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/value"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/valueClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/variableResolver"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewHandler"/>
-    </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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/textContent"/>
-    </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/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/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 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"/>
-    </genClasses>
-    <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/facesContextFactory"/>
-      <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/renderKitFactory"/>
-      <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#//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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/smallIcon"/>
-      <genFeatures createChild="false" 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#//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#//ListEntriesType">
-      <genFeatures createChild="false" 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" labelFeature="#//facesconfig/ManagedBeanClassType/textContent">
-      <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" labelFeature="#//facesconfig/ManagedBeanNameType/textContent">
-      <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" labelFeature="#//facesconfig/ManagedBeanScopeType/textContent">
-      <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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanClass"/>
-      <genFeatures createChild="false" 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"/>
-    </genClasses>
-    <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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/mapEntries"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/nullValue"/>
-      <genFeatures createChild="false" 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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/keyClass"/>
-      <genFeatures createChild="false" 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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/key"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/nullValue"/>
-      <genFeatures createChild="false" 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#//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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromAction"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromOutcome"/>
-      <genFeatures createChild="false" 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 createChild="false" 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#//NullValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NullValueType/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" labelFeature="#//facesconfig/PropertyClassType/textContent">
-      <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" labelFeature="#//facesconfig/PropertyNameType/textContent">
-      <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" labelFeature="#//facesconfig/PropertyResolverType/textContent">
-      <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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/defaultValue"/>
-      <genFeatures createChild="false" 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 createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanName"/>
-      <genFeatures createChild="false" 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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/componentFamily"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererType"/>
-      <genFeatures createChild="false" 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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitId"/>
-      <genFeatures createChild="false" 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/renderKitExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitType/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#//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#//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 createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorId"/>
-      <genFeatures createChild="false" 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#//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 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#//ApplicationExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterExtensionType"/>
-    <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#//FacesConfigExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorExtensionType"/>
-    <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>
-  </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 ba4d9e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
+++ /dev/null
@@ -1,555 +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
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 1df31cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension 
-      point="org.eclipse.core.runtime.contentTypes"> 
-      <content-type  
-         id="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>
-
-</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 04e932e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Tue Apr 10 09:31:38 PDT 2007
-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.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-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 d5b0848..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.1.102.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/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_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_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_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_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_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_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_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_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_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/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_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_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_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_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_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/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_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_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_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_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_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_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_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/metadata/html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
deleted file mode 100644
index 6a0ee55..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
+++ /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
-###############################################################################
-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
-
-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
-
-
-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 b069be6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml
+++ /dev/null
@@ -1,729 +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: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"
-	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>small/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>small/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>small/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>small/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>small/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>small/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"/>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>$nl$/icons/palette/HTML</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>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>%A.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%A.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_A.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%BR.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%BR.description</value>
-		</trait>		
-		<trait id="expert">
-			<value>true</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/HTML_BR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%INPUT.TEXT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%INPUT.TEXT.description</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>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>%FORM.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%FORM.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%HR.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%HR.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_HR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%IMG.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%IMG.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_IMG.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_IMG.gif</value>
-		</trait>
-	</entity>	
-	<entity id="LINK">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>		
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>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>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>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>%SELECT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%SELECT.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>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>%TABLE.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%TABLE.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_TABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%TEXTAREA.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%TEXTAREA.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>	
-	<entity id="TITLE">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>		
-	<entityGroup id="common-html-attributes">
-		<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>right</item>
-					<item>char</item>
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>
-		</entity>
-	
-		<entity id="alt">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="src">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accesskey">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept-charset">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="height">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>		
-		<entity id="ismap">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="longdesc">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.URIType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="maxlength">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.html</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="rel">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="rev">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</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>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="shape">
-			<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>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>default</value>
-			</trait>		
-			<trait id="category">
-				<value>%property.category.html</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>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="tabindex">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="valid-maximum"><value>32767</value></trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="target">
-			<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>_self</item>
-					<item>_blank</item>
-					<item>_parent</item>
-					<item>_top</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="usemap">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</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>middle</item>
-					<item>top</item>
-					<item>baseline</item>
-					<item>bottom</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>
-		</entity>			
-		<entity id="width">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.html</value>
-			</trait>			
-		</entity>
-							
-	</entityGroup>
-	<entityGroup id="common-core-attributes">
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="class">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="style">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="title">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</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="form-event-attributes">
-		<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 id="onreset">
-			<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-language-attributes" >
-		<entity id="dir">
-			<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>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>%property.category.language</value>
-			</trait>					
-		</entity>
-		<entity id="lang">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LanguageCodeType</value>
-			</trait>
-			<trait id="category">
-				<value>%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.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
deleted file mode 100644
index 3ca4a98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
+++ /dev/null
@@ -1,509 +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:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"
-	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>
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value>javax.faces.event.ActionListener</value>
-			</trait>		
-		</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>
-					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="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="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 id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType
-				</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					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>
-					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="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="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>percent</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>number</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.NumberPatternType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="currencyCode">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					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>
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value>javax.faces.convert.Converter</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>true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value>request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value>org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-		</entity>
-		<entity id="basename">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ResourceBundleType
-				</value>
-			</trait>
-		</entity>
-	</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="itemDisabled">
-			<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="value">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>javax.faces.model.SelectItem</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>
-	<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>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</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>
-					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>
-	<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>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>			
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>	
-		</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>
-					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>
-	<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>
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value>javax.faces.validator.Validator</value>
-			</trait>
-		</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>
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value>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>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.LocaleType	</value>
-			</trait>
-		</entity>	
-	</entity>
-
-	<entityGroup id="common-core-attributes" type="tag">
-		<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>				
-		</entity>			
-		<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>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
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 975d153..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml
+++ /dev/null
@@ -1,306 +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="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="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="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-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SUBVIEW.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="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>
-
-</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 1faabda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.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
-###############################################################################
-JSFCORE.display-label=JSF Core
\ No newline at end of file
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 227a40e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.xml
+++ /dev/null
@@ -1,188 +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:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value>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"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>icons/palette/JSFCORE</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>%JSFCORE.display-label</value>
-	</trait>
-	
-	<entity id="actionListener" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="attribute" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_ATTRIBUTE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_ATTRIBUTE.gif</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-	</entity>
-	<entity id="converter" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTER.gif</value>
-		</trait>
-	</entity>
-	<entity id="facet" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_FACET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_FACET.gif</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_LOADBUNDLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_LOADBUNDLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="param" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_PARAM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItem" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_SELECTITEM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTITEM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<trait id="small-icon">
-			<value>small/JSF_SELECTITEMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTITEMS.gif</value>
-		</trait>
-	</entity>
-	<entity id="subview" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_SUBVIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SUBVIEW.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLength" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validator" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATOR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATOR.gif</value>
-		</trait>
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VERBATIM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VERBATIM.gif</value>
-		</trait>
-	</entity>
-	<entity id="view" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VIEW.gif</value>
-		</trait>	
-	</entity>
-</md:metadatamodel>
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 5305412..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
+++ /dev/null
@@ -1,1244 +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:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"  
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-	
-	<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>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>submit</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value>%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>org.eclipse.jst.jsf.core.attributevalues.ColorType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<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.designtime.core.loadBundle</value>
-			</trait>
-			<trait id="category"><value>%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="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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</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>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>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="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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>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>lineDirection</value>
-			</trait>
-		</entity>
-		<entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>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>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>	
-		<entity id="layout">
-			<include-entity-group>common-attributes</include-entity-group>
-			<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>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>lineDirection</value>
-			</trait>				
-		</entity>			
-	</entity>
-	<entityGroup id="basic-jsf-html-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.jsf</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.jsf</value>
-			</trait>					
-		</entity>	
-		<entity id="converter">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-			</trait>			
-			<trait id="config-type">
-				<value>javax.faces.convert.Converter</value>
-			</trait>	
-			<trait id="category">
-				<value>%property.category.jsf</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.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</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>			
-			<trait id="category">
-				<value>%property.category.jsf</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>	
-			<trait id="category">
-				<value>%property.category.jsf</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>	
-			<trait id="category">
-				<value>%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>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>java.lang.String</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</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>	
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cols">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>			
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="globalOnly">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>			
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="redisplay">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>				
-		</entity>
-
-		<entity id="showDetail">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>		
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="dalign">
-			<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>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="ialign">
-			<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>bottom</item>
-					<item>middle</item>
-					<item>top</item>
-					<item>right</item>
-					<item>left</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>			
-		<entity id="linktype">
-			<trait id="attribute-value-runtime-type">
-				<value>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>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="media">
-			<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>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>%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="scope">
-			<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>row</item>
-					<item>col</item>
-					<item>rowgroup</item>
-					<item>colgroup</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>	
-	</entityGroup>
-	<entityGroup id="jsf-table-attributes">
-		<entity id="bgcolor">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>	
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>		
-		</entity>	
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellpadding">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellspacing">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columns">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum">
-				<value>0</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columnClasses">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</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>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="footerClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="frame">
-			<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>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>none</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>			
-		</entity>			
-		<entity id="headerClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rowClasses">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rules">
-			<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>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>none</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>							
-		</entity>
-		<entity id="showSummary">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="summary">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entityGroup>
-	<entityGroup id="for-entity">
-		<entity id="for">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value>%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 8841c0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml
+++ /dev/null
@@ -1,842 +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="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"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</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"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</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"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</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>
-			</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>
-			</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"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="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/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"
-				/>
-				<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.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"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</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"
-				/>
-			</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"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</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"
-					widget="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)"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<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"/>
-						<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)"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<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"/>
-						<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"
-					widget="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 eb69474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties
+++ /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
-###############################################################################
-JSFHTML.display-label=JSF HTML
-commandButton.display-label=Command Button
-commandLink.display-label=Command Link
-dataTable.display-label=Data Table
-form.display-label=Form
-graphicImage.display-label=Graphic Image
-inputHidden.display-label=Hidden Input
-inputSecret.display-label=Secret Input
-inputText.display-label=Text Input
-inputTextarea.display-label=Textarea Input
-message.display-label=Message
-messages.display-label=Messages
-outputFormat.display-label=Output Format
-outputLabel.display-label=Output Label
-outputLink.display-label=Output Link
-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 d4b216e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml
+++ /dev/null
@@ -1,443 +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:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-	
-	<trait id="paletteInfos" >
-		<value xsi:type="pi:PaletteInfos">
-			<item id="outputLabel"/>
-			<item id="inputText"/>
-			<item id="commandButton"/>
-			<item id="inputTextarea"/>
-			<item id="outputText"/>
-			<item id="form"/>
-			<item id="inputHidden"/>
-			<item id="inputSecret"/>
-			<item id="column"/>
-			<item id="commandLink"/>
-			<item id="message"/>			
-			<item id="messages"/>
-			<item id="outputFormat"/>
-			<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>/icons/palette/JSFHTML/</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>%JSFHTML.display-label</value>
-	</trait>
-		
-	<entity id="commandButton" type="tag">	
-		<trait id="display-label">
-			<value>%commandButton.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<trait id="display-label">
-			<value>%commandLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>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>%dataTable.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_DATATABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%form.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_FORM.gif</value>
-		</trait>	
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="display-label">
-			<value>%graphicImage.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_GRAPHICIMAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_GRAPHICIMAGE.gif</value>
-		</trait>		
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<trait id="display-label">
-			<value>%inputHidden.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTHIDDEN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTHIDDEN.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<trait id="display-label">
-			<value>%inputSecret.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTSECRET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTSECRET.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="inputText" type="tag">
-		<trait id="display-label">
-			<value>%inputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<trait id="display-label">
-			<value>%inputTextarea.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="message" type="tag">
-		<trait id="display-label">
-			<value>%message.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_MESSAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_MESSAGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<trait id="display-label">
-			<value>%messages.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_MESSAGES.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_MESSAGES.gif</value>
-		</trait>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<trait id="display-label">
-			<value>%outputFormat.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTFORMAT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%outputLabel.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTLABEL.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%outputLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="outputLink"
-					_$uri$="http://java.sun.com/jsf/html" />
-				]]></template>
-
-			</value>
-		</trait>			
-	</entity>
-	<entity id="outputText" type="tag">
-		<trait id="display-label">
-			<value>%outputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%panelGrid.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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>%panelGroup.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_PANELGROUP.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_PANELGROUP.gif</value>
-		</trait>	
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="display-label">
-			<value>%selectBooleanCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="display-label">
-			<value>%selectManyCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyListbox" type="tag">
-		<trait id="display-label">
-			<value>%selectManyListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<trait id="display-label">
-			<value>%selectManyMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYMENU.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<trait id="display-label">
-			<value>%selectOneListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONELISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONELISTBOX.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<trait id="display-label">
-			<value>%selectOneMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<trait id="display-label">
-			<value>%selectOneRadio.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="display-label">
-			<value>%column.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COLUMN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>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 1cd7345..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml
+++ /dev/null
@@ -1,282 +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:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	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>$nl$/icons/palette/JSP</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>JSP</value>
-	</trait>
-	
-	<entity id="jsp:directive.include">
-		<trait id="display-label">
-			<value>%directive.include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:directive.page">
-		<trait id="display-label">
-			<value>%directive.page.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.page.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:directive.taglib">
-		<trait id="display-label">
-			<value>%directive.taglib.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.taglib.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:expression">
-		<trait id="display-label">
-			<value>%expression.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%expression.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_EXPRESSION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_EXPRESSION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:declaration">
-		<trait id="display-label">
-			<value>%declaration.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%declaration.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DECLARATION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DECLARATION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:useBean">
-		<trait id="display-label">
-			<value>%useBean.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%useBean.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_USEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_USEBEAN.gif</value>
-		</trait>
-	</entity>	
-		
-	<entity id="jsp:getProperty">
-		<trait id="display-label">
-			<value>%getProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%getProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_GETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_GETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:setProperty">
-		<trait id="display-label">
-			<value>%setProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%setProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:include">
-		<trait id="display-label">
-			<value>%include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_INCLUDE.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:text">
-		<trait id="display-label">
-			<value>%text.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%text.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_TEXT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:root">
-		<trait id="display-label">
-			<value>%root.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%root.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_ROOT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_ROOT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:forward">
-		<trait id="display-label">
-			<value>%forward.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%forward.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FORWARD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FORWARD.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:param">
-		<trait id="display-label">
-			<value>%param.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%param.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAM.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:params">
-		<trait id="display-label">
-			<value>%params.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%params.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAMS.gif</value>
-		</trait>
-	</entity>		
-	<entity id="jsp:plugin">
-		<trait id="display-label">
-			<value>%plugin.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%plugin.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PLUGIN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PLUGIN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:fallback">
-		<trait id="display-label">
-			<value>%fallback.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%fallback.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FALLBACK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FALLBACK.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:scriptlet">
-		<trait id="display-label">
-			<value>%scriptlet.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%scriptlet.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SCRIPTLET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SCRIPTLET.gif</value>
-		</trait>
-	</entity>	
-</md:metadatamodel>
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 5c6686a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
+++ /dev/null
@@ -1,17 +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:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-	
-
-	<entity id="view" type="tag">
-		<entity id="locale">
-			<trait id="sets-locale">
-				<value>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 f32d133..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml
+++ /dev/null
@@ -1,188 +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="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="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 d68e875..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
+++ /dev/null
@@ -1,43 +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>
-   </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 005f4e4..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";
-
-	// 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 123186c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:49:41 PDT 2007
-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=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.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.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.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 7faef7e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,44 +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.1.102.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,1.2.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.1.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.2.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)"
-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 8d7f590..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
+++ /dev/null
@@ -1,20 +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
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
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 9de0b95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,45 +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=JSF EL Symbol
-
-jsf.library.reference=JSF Library References
-jsf.library.wizard.name=JSF Library
-
-preferencepage.jsflibraries.name=Libraries
-preferencepage.jsfvalidation.name=Validation
-preferencepage.jsf.name=JavaServer Faces Tools
-
-classpathContainerPage.name.0 = JSF Libraries
-
-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 #{}
\ No newline at end of file
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 b1306b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,314 +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.classpath.JSFLibrariesPreferencePage"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryPage"
-           name="%preferencepage.jsflibraries.name"/>
-     <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.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>
-  </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="total"
-			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.jdt.ui.classpathContainerPage">
-       <classpathContainerPage
-             class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryContainerWizardPage"
-             id="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"
-             name="%classpathContainerPage.name.0">
-       </classpathContainerPage>
-    </extension>
-    <extension
-          point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
-       <hyperlinkDetector
-             class="org.eclipse.jst.jsf.ui.internal.jspeditor.ELHyperlinkDetector"
-             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 14c3eab..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";
-    private static final String KEY_DESIGNTIME = "/metadatagen";
-
-    
-    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);
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n");
-    }
-
-    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 e55185e..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("/");;
-                ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-                        pluginBase, "icons/" + name));
-                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);
-            }
-        }
-        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 15592d6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
+++ /dev/null
@@ -1,379 +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_JSFLibraryLabel0;
-
-    /**
-     * 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_ComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployJAR;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplButtonTooltip;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NullProject;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_RemoveAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonTooltip;
-    /**
-     * 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_V1Registry_Warning_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText;
-    /**
-     * 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_IMPLS_ONLY_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateImplementation;
-    /**
-     * 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_V1JSFLibrary_DialogMessage;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_V1JSFLibrary_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_VersionSupported;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_IsJSFImplementation;
-    /**
-     * 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;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
deleted file mode 100644
index db72352..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
+++ /dev/null
@@ -1,404 +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 java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-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.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.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-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.PluginProvidedJSFLibrary;
-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.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Provides a preference page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibrariesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage
-{
-	private IWorkbench wb;
-
-	private TreeViewer tv;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	
-	private Composite btnComp;
-
-	private Button btnNew;
-	private Button btnEdit;
-	private Button btnDelete;
-	private Button btnMakeDefaultImpl;
-	
-	protected Control createContents(Composite parent) {
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false)); 
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));				
-		
-		Label lblLibs = new Label(c, SWT.NONE);
-		lblLibs.setText(Messages.JSFLibrariesPreferencePage_DefinedJSFLibraries);
-		GridData gd1 = new GridData();
-		gd1.horizontalSpan = 2;
-		lblLibs.setLayoutData(gd1);
-		
-		tv = new TreeViewer(c, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tv.setContentProvider(tvAdapter);
-		tv.setLabelProvider(tvLabelProvider);
-		tv.addSelectionChangedListener(tvAdapter);
-		tv.addDoubleClickListener(tvAdapter);
-		tv.setComparator(tvAdapter);
-		tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tv.setInput(getJSFLibraries());
-		
-		createButtons(c);
-		
-		return c;
-	}
-
-	private void createButtons(Composite c){		
-		btnComp = new Composite(c, SWT.NONE);
-		GridLayout gl1 = new GridLayout(1, false);
-		gl1.marginHeight = 0;
-		gl1.marginWidth = 0;
-		btnComp.setLayout(gl1);
-		btnComp.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_FILL));
-		
-		btnNew = new Button(btnComp, SWT.NONE);
-		btnNew.setText(Messages.JSFLibrariesPreferencePage_New);
-		btnNew.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnNew.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				openJSFLibraryEditDialog(null);
-			}
-		});
-		
-		btnEdit = new Button(btnComp, SWT.NONE);
-		btnEdit.setText(Messages.JSFLibrariesPreferencePage_Edit);
-		btnEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnEdit.setEnabled(false);
-		btnEdit.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				TreeItem[] element = tv.getTree().getSelection();
-				if (element != null){
-					openJSFLibraryEditDialog(element[0]);
-				}
-
-			}
-		});
-		
-		btnDelete = new Button(btnComp, SWT.NONE);
-		btnDelete.setText(Messages.JSFLibrariesPreferencePage_Remove);
-		btnDelete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnDelete.setEnabled(false);
-		btnDelete.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				boolean modified = false;
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						while (it.hasNext()){
-							JSFLibrary lib = (JSFLibrary)it.next();
-							if (lib instanceof PluginProvidedJSFLibrary)
-								MessageDialog.openInformation(
-										getShell(),
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle,
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage);
-	
-							else {
-								JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().removeJSFLibrary(lib);
-								modified = true;
-							}
-						}
-						if (modified){
-							JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-							tv.refresh();
-						}
-					}
-				}
-			}
-		});
-		
-		btnMakeDefaultImpl = new Button(btnComp, SWT.NONE);
-		btnMakeDefaultImpl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_END));
-		btnMakeDefaultImpl.setText(Messages.JSFLibrariesPreferencePage_MakeDefault);
-		btnMakeDefaultImpl.setVisible(false);
-		btnMakeDefaultImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						if (objs.getFirstElement() instanceof JSFLibrary){
-							 JSFLibrary lib = (JSFLibrary)objs.getFirstElement();
-							 JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().setDefaultImplementation(lib);							 							
-						 }
-						 JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-						 tv.refresh();
-					}
-				}
-			}
-		});
-		
-	}
-	private Object getJSFLibraries() {
-		return JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-	}
-
-	public void init(IWorkbench workbench) {
-		wb = workbench;
-		setDescription(Messages.JSFLibrariesPreferencePage_Description);
-		noDefaultAndApplyButton();
-	}
-	
-	/**
-	 * Getter created only for JUnit tests.  Should not be used otherwise.
-	 * @return the TreeViewer of JSF Libraries
-	 */
-	public Viewer getLibraryViewer(){
-		return tv;
-	}
-	
-	private class TreeViewerAdapter extends ViewerComparator implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {
-		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 ((List)getJSFLibraries()).toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return ((JSFLibrary)element).getArchiveFiles().toArray();
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-//			if (elements instanceof JSFLibrary) {
-//				return tvAdapter.getParent(tv.getTree().class, element);
-//			}
-			return null;//fParentElement;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return true;
-			}
-			return false;
-		}		
-
-		// ------- ISelectionChangedListener Interface ------------
-
-		public void selectionChanged(SelectionChangedEvent event) {
-			doListSelected(event);
-		}
-		
-		/* (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) {
-			if (e1 instanceof JSFLibrary && e2 instanceof JSFLibrary){
-				JSFLibrary lib1 = (JSFLibrary)e1;
-				JSFLibrary lib2 = (JSFLibrary)e2;
-				
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			return super.compare(viewer, e1, e2);
-		}
-		
-		
-	}
-
-	/**
-	 * Respond to a list selection event
-	 * 
-	 * @param event
-	 */
-	protected void doListSelected(SelectionChangedEvent event) {
-		updateButtonState();
-	}
-
-	/**
-	 * Respond to a double click event by opening the edit dialog
-	 * @param event
-	 */
-	protected void doDoubleClick(DoubleClickEvent event) {
-		openJSFLibraryEditDialog(tv.getTree().getSelection()[0]);
-	}
-	
-	private void updateButtonState() {
-		btnEdit.setEnabled(tv.getTree().getSelectionCount() == 1);	
-		if (tv.getTree().getSelectionCount() == 1 && tv.getTree().getSelection()[0].getData() instanceof JSFLibrary){	
-			btnDelete.setEnabled(true);
-			btnMakeDefaultImpl.setVisible(false);
-			JSFLibrary lib = (JSFLibrary)tv.getTree().getSelection()[0].getData();
-			btnMakeDefaultImpl.setVisible(lib.isImplementation());
-		} else {
-			btnDelete.setEnabled(false);
-			btnMakeDefaultImpl.setVisible(false);
-		}
-	}
-	
-	private void openJSFLibraryEditDialog(Object element) {
-		if (isPluginProvidedJSFLibrary(element)){
-			MessageDialog.openInformation(
-					getShell(),
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle,
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage);
-			return;
-		}
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		wizard.init(wb, getStructuredElement(element));
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			tv.refresh();
-		}
-	}
-	
-	private IStructuredSelection getStructuredElement(Object element) {
-		if (element instanceof TreeItem){
-			Object item = ((TreeItem)element).getData();
-			if (item instanceof ArchiveFile){
-				JSFLibrary parent = ((ArchiveFile)item).getJSFLibrary();
-				return new StructuredSelection(parent);
-			} else if (item instanceof JSFLibrary) {
-				return new StructuredSelection(item);
-			}
-		}
-		return null;
-	}
-
-	private boolean isPluginProvidedJSFLibrary(Object treeElement){
-		if (treeElement instanceof TreeItem){
-			Object item = ((TreeItem)treeElement).getData();
-			if (item instanceof PluginProvidedJSFLibrary){
-				return true;
-			} else if (item instanceof ArchiveFile) {
-				return (((ArchiveFile)item).getJSFLibrary() instanceof PluginProvidedJSFLibrary);
-			}
-		}
-		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 JSFLibrary)
-            {
-				return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					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) {
-            // no listeners supported
-		}
-
-		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) {
-            // no listeners supported
-		}
-	}
-
-}
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 950a405..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
+++ /dev/null
@@ -1,579 +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.Collections;
-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
- */
-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 boolean   _projectHaveV1JSFLibraries; // = false;
-	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);
-        if (this.isJSFProject)
-		{
-			_projectHaveV1JSFLibraries = 
-			    JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(_iproject);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#finish()
-	 */
-	public boolean finish() {
-	    boolean finish = true;
-	    if (_projectHaveV1JSFLibraries)
-	    {
-	        // if the user doesn't want to confirm, back off on the change
-	        // and let them decide if they want to hit cancel
-	        finish = WarningMessageDialog.
-	            openConfirm(getShell()
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText);
-	        
-	        if (finish)
-	        {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(Collections.singletonList(_iproject));
-	        }
-	    }
-		return finish;
-	}
-
-	/* (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 c781571..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
+++ /dev/null
@@ -1,499 +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
- */
-public class JSFLibraryEditControl extends Composite implements ModifyListener, SelectionListener 
-{
-	private Text txtName;
-	private Label lblName;
-	private CCombo cboVersions;
-	private Label lblVersions;
-	private Button chkDeploy;
-	private Button chkImpl;
-	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);
-
-		chkImpl = new Button(this, SWT.CHECK);
-		chkImpl.setText(Messages.JSFLibraryWizard_IsJSFImplementation);
-		GridData gd3 = new GridData();
-		gd3.horizontalSpan = 2;
-		chkImpl.setLayoutData(gd3);
-		chkImpl.addSelectionListener(this);
-
-		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());
-			chkImpl.setSelection(workingCopyLibrary.isImplementation());
-		}
-		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 value of the user input for the isJSFImplementation checkbox
-	 */
-	public boolean getIsImplementation() {
-		return chkImpl.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;
-	}
-
-	/**
-	 * @param implsOnly
-	 */
-	public void setImplOnly(boolean implsOnly) {
-		if (implsOnly){
-			chkImpl.setSelection(true);
-			chkImpl.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * @param nonImplsOnly
-	 */
-	public void setNonImplOnly(boolean nonImplsOnly) {
-		if (nonImplsOnly){
-			chkImpl.setSelection(false);
-			chkImpl.setEnabled(false);
-		}
-	}
-}
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 a869d0a..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
- *
- */
-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 dbd6b01..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
- *
- */
-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 bf771b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
+++ /dev/null
@@ -1,285 +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 java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-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
- */
-public class JSFLibraryWizard extends Wizard implements INewWizard {
-
-	/**
-	 * Implementation libaries to be included
-	 */
-	public final static int IMPLS = 1;
-	/**
-	 * Non-Implementation libaries to be included
-	 */
-	public final static int NONIMPLS = 2;
-	
-	private JSFLibraryEditControl jsfLibraryEditControl;
-	
-	private boolean isNew = false;
-	private boolean modified = false;
-
-	private JSFLibrary curLibrary;
-	private JSFLibrary workingCopyLibrary;
-
-	private JSFLibraryWizardPage page;
-
-	private boolean _impls;	
-	private boolean _nonimpls;
-	
-    private List<IProject>        _projectsWithV1JSFLibraries = new ArrayList<IProject>();
-	
-	/**
-	 * Constructor
-	 * see IMPLS
-	 * see NONIMPLS
-	 * @param libTypes 
-	 */
-	public JSFLibraryWizard(int libTypes) {
-		super();
-		if ((libTypes & IMPLS) == IMPLS)
-			_impls = true;
-
-		if ((libTypes & NONIMPLS) == NONIMPLS)
-			_nonimpls = true;
-	}
-
-	
-	/**
-	 * Constructor.   List will include all JSF Libraries.
-	 */
-	public JSFLibraryWizard() {
-		super();
-		_impls = true;
-		_nonimpls = true;
-	}
-
-	private boolean isImplsOnly(){
-		if (_impls && ! _nonimpls)
-			return true;
-		return false;		
-	}
-	
-	private boolean isNonImplsOnly(){
-		if (_nonimpls && ! _impls)
-			return true;
-		return false;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) 
-	{
-	    initV1LibrariesList();
-	    
-		if (selection != null
-				&& selection.getFirstElement() instanceof JSFLibrary) {
-			curLibrary = (JSFLibrary) selection.getFirstElement();
-			workingCopyLibrary = curLibrary.getWorkingCopy();
-		} else {
-			isNew = true;
-			workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		}
-		if (isImplsOnly()) {
-			setWindowTitle(Messages.JSFLibraryWizard_CreateImplementation);
-		} else {
-			setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
-		}
-	}
-
-	private void initV1LibrariesList()
-	{
-        final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-        
-        // loop through the workspace and look for projects that are still using the V1 way
-        // of doing JSF libraries
-        for (int i = 0; i < projects.length; i++)
-        {
-            final IProject project = projects[i];
-            if (JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(project))
-            {
-                _projectsWithV1JSFLibraries.add(project);
-            }
-        }
-    }
-
-	/**
-	 * 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() 
-	{
-	    // on init, if we detected any projects with old library
-	    // refs, we need to warn the user
-	    if (!isNew &&  // can ignore new libraries, since old projects can't possibly have dependencies on them
-	            _projectsWithV1JSFLibraries.size() > 0)
-	    {
-	        String  projectNames = ""; //$NON-NLS-1$
-	        for (Iterator<IProject> it = _projectsWithV1JSFLibraries.iterator(); it.hasNext();)
-	        {
-	            IProject project = it.next();
-	            projectNames += project.getName() + ","; //$NON-NLS-1$
-	        }
-	        // trim trailing comma
-	        if (projectNames.length() > 0)
-	        {
-	            projectNames = projectNames.substring(0, projectNames.length()-1);
-	        }
-	        
-	        final String messageText = MessageFormat.format(Messages.JSFLibraryWizard_V1JSFLibrary_DialogMessage,
-	                                        new Object[] {projectNames});
-	        MessageDialogWithToggle dialog = 
-	            WarningMessageDialogWithToggle.openOkCancelConfirm
-	                (getShell(), Messages.JSFLibraryWizard_V1JSFLibrary_DialogTitle, messageText, Messages.JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel, false, null, null);
-	        if (dialog.getReturnCode() != IDialogConstants.OK_ID)
-	        {
-	            // abort if the user doesn't really want to commit this change
-	            return false;
-	        }
-
-	        // if user accepted and asked not be warned again, clear the 
-	        // the project properties.
-	        if (dialog.getToggleState())
-            {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(_projectsWithV1JSFLibraries);
-            }
-	    }
-	    
-		final String name = jsfLibraryEditControl.getJSFLibraryName();
-		final boolean isDeployed = jsfLibraryEditControl.getIsDeployed();
-		final boolean isImplementation = jsfLibraryEditControl.getIsImplementation();
-		final JSFVersion version = jsfLibraryEditControl.getJSFVersion();
-		
-		workingCopyLibrary.setName(name);
-		workingCopyLibrary.setDeployed(isDeployed);
-		workingCopyLibrary.setImplementation(isImplementation);
-		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(isImplsOnly() 
-			        ? Messages.JSFLibraryWizard_IMPLS_ONLY_DESC
-			        : 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.setImplOnly(isImplsOnly());
-			jsfLibraryEditControl.setNonImplOnly(isNonImplsOnly());
-			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 ad3b136..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
- *
- */
-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 834889d..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
- *
- */
-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 86f7f78..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";
-
-    private static final String TRAIT_ICON_LARGE = "large-icon";
-
-    /**
-     * @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");
-        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 fc469c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/ViewObjectPresenter.java
+++ /dev/null
@@ -1,247 +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 ? "" //$NON-NLS-2$
-                        : componentType));
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_ComponentClass,
-                componentClass == null ? "" //$NON-NLS-2$
-                        : componentClass));
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_ComponentFamily,
-                componentFamily == null ? "" //$NON-NLS-2$
-                        : componentFamily));
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_RenderType,
-                renderType == null ? "" : renderType)); //$NON-NLS-2$
-        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 = "";
-        for (final String name : sortedInterfaceNames)
-        {
-            text += ViewObjectPresenter.createLine(null, name);
-        }
-        return String.format("<form>%s</form>", text);
-    }
-
-    /**
-     * @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");
-            }
-
-            _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 c629e5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentInstanceDetailsForm.java
+++ /dev/null
@@ -1,227 +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.swt.widgets.Composite;
-
-/**
- * Detail section for a component instance.
- * 
- * @author cbateman
- * 
- */
-/* package */class ComponentInstanceDetailsForm extends
-        AbstractXMLSectionsDetailsForm
-{
-
-    private static final String COMPONENT_SECTION_KEY      = "componentSection";
-    private final static String COMPONENT_TYPE_SECTION_KEY = "componentTypeSection";
-    private static final String COMPONENT_INTERFACES_KEY   = "componentInterfacesSection";
-    private static final String COMPONENT_DECORATORS_KEY   = "componentDecorators";
-    private static final String COMPONENT_PROPERTIES_KEY   = "componentProperties";
-    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>";
-        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("Name", className != null ? Signature
-                .getSimpleName(className) : ""));
-        values.add(new TitleValuePair("Id", id != null ? id : "<i>none</i>"));
-        values.add(new TitleValuePair("Parent Id", (parent != null && parent
-                .getId() != null) ? parent.getId() : "<i>none</i>"));
-
-        _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 = "";
-        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>",
-                text), true, false);
-        _componentDecoratorsSection.refresh();
-    }
-
-    private void updateComponentPropertiesSection(final ComponentInfo compInfo)
-    {
-        List<TitleValuePair> propertyLines = new ArrayList<TitleValuePair>();
-        String text = "";
-        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>",
-                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,
-                "Instance Info");
-        sections.put(COMPONENT_SECTION_KEY, _componentSection);
-
-        _componentTypeSection = new XMLTextSection(getToolkit(), parent,
-                "Type Info Information");
-        sections.put(COMPONENT_TYPE_SECTION_KEY, _componentTypeSection);
-
-        _componentInterfacesSection = new XMLTextSection(getToolkit(), parent,
-                "Interfaces");
-        sections.put(COMPONENT_INTERFACES_KEY, _componentInterfacesSection);
-
-        _componentDecoratorsSection = new XMLTextSection(getToolkit(), parent,
-                "Decorators");
-        sections.put(COMPONENT_DECORATORS_KEY, _componentDecoratorsSection);
-
-        _componentPropertiesSection = new XMLTextSection(getToolkit(), parent,
-                "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 "Converter: id=\""
-                            + converter.getTypeInfo().getConverterId()
-                            + "\", converter-class="
-                            + converter.getTypeInfo().getClassName();
-                }
-                else if (element instanceof ValidatorDecorator)
-                {
-                    final ValidatorDecorator validator = (ValidatorDecorator) element;
-                    return "Validator: id=\""
-                            + validator.getTypeInfo().getValidatorId()
-                            + "\", validator-class="
-                            + validator.getTypeInfo().getClassName();
-                }
-                else if (element instanceof FacetDecorator)
-                {
-                    final FacetDecorator decorator = (FacetDecorator) element;
-                    return "Facet: " + decorator.getName() + ", component="
-                            + 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 40828ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterForm.java
+++ /dev/null
@@ -1,306 +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.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("Refresh View");
-        _refreshAction.setToolTipText("Refresh View");
-        _refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault()
-                .getImageDescriptor("refresh_nav_16.gif"));
-    }
-
-    @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 ? "<unknown>" : viewId;
-        label.setText("View: " + viewId + " (Project: "
-                + _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 = "";
-                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 + ")";
-                }
-                return text;
-            }
-            else if (obj instanceof TreePlaceHolder)
-            {
-                return "Calculating view...";
-            }
-            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");
-            }
-            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 8596a1c..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("Nothing to display");
-        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 1202c7c..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("Updating view root");
-            _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/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 6bf74bb..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);
-                }
-            }
-        }
-
-        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 85fc288..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
- *
- */
-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 df3b0f1..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
- *
- */
-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 2bae57c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
+++ /dev/null
@@ -1,997 +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.ComboViewer;
-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.JSFLibraryConfigModel;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-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.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-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.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-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.Combo;
-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.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
- */
-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 Button btnServerSupplied;
-	private Button btnUserSupplied;
-	private ComboViewer cvImplLib;
-	private CheckboxTableViewer ctvSelCompLib;
-	private Button btnDeployJars;
-	private TreeViewer tvCompLib;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	private Combo comboImplLib;
-	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(JSFLibraryConfiglModelSource 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 current selected JSF Implementation Library.
-	 * Otherwise, return null.
-	 *  
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getSelectedJSFLibImplementation() {
-		return workingCopyModel.getCurrentJSFImplementationLibrarySelection();
-	}
-	 
-	/**
-	 * 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() {
-		loadJSFImplList();
-		
-		btnDeployJars.setSelection(false);
-		JSFLibraryInternalReference savedImplLib = workingCopyModel.getSavedJSFImplementationLibrary();
-		if ( savedImplLib != null ) {
-			/*
-			 * Get the input for the control to set selection.
-			 */
-			JSFLibraryInternalReference selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedImplLib.getID());
-			if (selected != null) {
-				btnDeployJars.setSelection(selected.isCheckedToBeDeployed());			
-				cvImplLib.setSelection(new StructuredSelection(selected), true);
-			}
-		} else {
-			JSFLibraryInternalReference dftJSFImplLib = JSFLibraryRegistryUtil.getInstance().getDefaultJSFImplementationLibrary();
-			if (dftJSFImplLib != null) {			
-				btnDeployJars.setSelection(dftJSFImplLib.isCheckedToBeDeployed());	
-				cvImplLib.setSelection(new StructuredSelection(dftJSFImplLib), true);				
-			}
-			else 
-				btnDeployJars.setEnabled(false);
-		}
-		
-		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();
-		
-		initializeImplementationType();
-		
-		redraw();
-	}
-	
-	private void initializeImplementationType() {
-		IMPLEMENTATION_TYPE implType = workingCopyModel.getImplementationType();
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
-			btnServerSupplied.setSelection(true);
-			btnUserSupplied.setSelection(false);
-			enableUserSupplied(false);
-		} else if (implType == IMPLEMENTATION_TYPE.USER_SPECIFIED) {
-			btnServerSupplied.setSelection(false);
-			btnUserSupplied.setSelection(true);
-			enableUserSupplied(true);
-		} else {
-			enableUserSupplied(false);
-		}	
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, implType);
-	}
-	private void loadJSFImplList() {
-		cvImplLib.setInput(workingCopyModel.getJSFImplementationLibraries());
-	}
-	
-	private void loadJSFCompList() {
-		tvCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
-		ctvSelCompLib.setInput(workingCopyModel.getJSFComponentLibraries());		
-	}
-	
-	private JSFLibraryInternalReference getCurrentSelectedJSFImplLib() {
-		JSFLibraryInternalReference selJSFImpl = null;
-		StructuredSelection objs = (StructuredSelection)cvImplLib.getSelection();
-		if (objs != null){
-			if (objs.getFirstElement() instanceof JSFLibraryInternalReference){
-				selJSFImpl = (JSFLibraryInternalReference)objs.getFirstElement();
-			}
-		}
-		return selJSFImpl;		
-	}
-
-	private void createImplLibControls(Composite parent) {
-		final Composite cmpImpls = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutImpls = new GridLayout();
-		gridLayoutImpls.numColumns = 4;
-		gridLayoutImpls.marginLeft = 0;
-		gridLayoutImpls.marginTop = 0;
-		gridLayoutImpls.marginBottom = 0;
-		
-		cmpImpls.setLayout(gridLayoutImpls);
-		GridData gdCmpImpls = new GridData();
-		gdCmpImpls.horizontalAlignment = SWT.FILL;
-		gdCmpImpls.grabExcessHorizontalSpace = true;
-		cmpImpls.setLayoutData(gdCmpImpls);
-
-		btnServerSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnServerSupplied.setToolTipText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonTooltip);
-		GridData gdSS = new GridData();
-		gdSS.horizontalAlignment = SWT.BEGINNING;
-		btnServerSupplied.setLayoutData(gdSS);
-		
-		btnServerSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setServerSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		Label lblServerSupplied = new Label(cmpImpls, SWT.NONE);
-		lblServerSupplied.setText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonLabel);
-		GridData lblSS = new GridData();
-		lblSS.grabExcessHorizontalSpace = true;
-		lblServerSupplied.setLayoutData(lblSS);
-		lblServerSupplied.addMouseListener(new MouseAdapter(){
-			public void mouseUp(MouseEvent e) {
-				btnServerSupplied.setSelection(true);
-				setServerSuppliedLibrarySelection(e);				
-			}			
-		});
-		
-		
-		Label lblSpacer1 = new Label(cmpImpls, SWT.NONE);
-		GridData gdSpc1 = new GridData();
-		gdSpc1.horizontalAlignment = SWT.END;
-		gdSpc1.horizontalSpan = 2;
-		lblSpacer1.setLayoutData(gdSpc1);
-		
-		btnUserSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnUserSupplied.setLayoutData(new GridData());
-		btnUserSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setUserSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		this.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-			public void okClicked(JSFImplLibraryCreationEvent event) {				
-				if (! btnUserSupplied.getSelection()  && event.isLibraryCreated()) {
-					btnServerSupplied.setSelection(false);
-					setUserSuppliedLibrarySelection(event);
-				}				
-			}			
-		});
-			
-		cvImplLib = new ComboViewer(cmpImpls, SWT.READ_ONLY);
-		cvImplLib.setLabelProvider(new ImplLibCVListLabelProvider());
-		cvImplLib.setContentProvider(new ImplLibCVContentProvider());
-		comboImplLib = cvImplLib.getCombo();
-		GridData gd_cvImplLib = new GridData();
-		gd_cvImplLib.horizontalAlignment = SWT.FILL;
-		gd_cvImplLib.grabExcessHorizontalSpace = true;
-		comboImplLib.setLayoutData(gd_cvImplLib);
-		cvImplLib.addSelectionChangedListener(
-			new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					StructuredSelection ss = (StructuredSelection) event.getSelection();
-					JSFLibraryInternalReference crtSelImplLib = (JSFLibraryInternalReference) ss.getFirstElement();
-					if (crtSelImplLib != null)
-					{
-					    btnDeployJars.setEnabled(true);
-	                    crtSelImplLib.setToBeDeployed(btnDeployJars.getSelection());
-					}
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(crtSelImplLib);
-					model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, crtSelImplLib);
-					fireChangedEvent(event);
-				}
-			}
-		);
-			
-		btnDeployJars = new Button(cmpImpls, SWT.CHECK);
-		GridData gdDeploy = new GridData();
-		btnDeployJars.setLayoutData(gdDeploy);
-		btnDeployJars.setText(Messages.JSFLibraryConfigControl_DeployButtonLabel);
-		btnDeployJars.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		btnDeployJars.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (! _initing){
-					JSFLibraryInternalReference jsflib = getCurrentSelectedJSFImplLib();
-					if (jsflib != null)
-						jsflib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(jsflib);//why r we doing this here???
-	//				model.setProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, btnDeployJars.getSelection());
-					fireChangedEvent(e);
-				}
-			}
-		}
-		);
-		
-		final Button btnNewImpl = new Button(cmpImpls, SWT.NONE); //compTest,
-		GridData gdNew = new GridData();
-		gdNew.horizontalAlignment = SWT.END;
-		btnNewImpl.setLayoutData(gdNew);
-		btnNewImpl.setText(Messages.JSFLibraryConfigControl_NewImplementationLibrary);	
-		btnNewImpl.setToolTipText(Messages.JSFLibraryConfigControl_NewImplButtonTooltip);
-		btnNewImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.IMPLS);
-				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.getJSFImplementationLibraries().add(lib);
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(lib);
-					
-					loadJSFImplList();
-					btnDeployJars.setSelection(true);
-					cvImplLib.setSelection(new StructuredSelection(lib), true);
-					
-				}
-				// notify listeners that a JSF implementation is created.
-				JSFImplLibraryCreationEvent event = new JSFImplLibraryCreationEvent(this, (ret == Window.OK));
-				int size = newJSFLibCreatedListeners.size();
-				for (int i = 0; i < size; i++) {
-					IJSFImplLibraryCreationListener listener = 
-						(IJSFImplLibraryCreationListener) newJSFLibCreatedListeners.elementAt(i);
-					listener.okClicked(event);
-				}
-			}
-		});		
-	}
-	
-	private void setServerSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(false);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED);
-		enableUserSupplied(false);
-		fireChangedEvent(e);
-		
-	}
-	
-	private void setUserSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(true);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.USER_SPECIFIED);
-		enableUserSupplied(true);	
-		fireChangedEvent(e);
-	}
-	
-	private void enableUserSupplied(boolean enabled) {
-		cvImplLib.getCombo().setEnabled(enabled);
-		btnDeployJars.setEnabled(enabled);		
-	}
-	
-	private void createCompLibControls(Composite parent) {
-		final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutCompLibs = new GridLayout();
-		gridLayoutCompLibs.numColumns = 4;
-		gridLayoutCompLibs.marginLeft = 0;
-		gridLayoutCompLibs.marginRight = 0;
-		gridLayoutCompLibs.marginWidth = 0;
-		cmpCompLibs.setLayout(gridLayoutCompLibs);
-		GridData gdComp = new GridData();
-		gdComp.horizontalAlignment = SWT.FILL;
-		gdComp.grabExcessHorizontalSpace = true;
-		cmpCompLibs.setLayoutData(gdComp);
-		
-		
-		final Label lblCompLib = new Label(cmpCompLibs, SWT.NONE);
-		final GridData gd_lbl_complib = new GridData(GridData.FILL, GridData.CENTER, false, false, 4, 1);
-		lblCompLib.setLayoutData(gd_lbl_complib);
-		lblCompLib.setText(Messages.JSFLibraryConfigControl_ComponentLibrary);
-				
-		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(gl_Single);
-		
-		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(JSFLibraryWizard.NONIMPLS);				
-				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);
-		
-		createImplLibControls(this);
-		createSeparator(this);
-		createCompLibControls(this);
-		
-
-
-
-	}
-
-	private void createSeparator(Composite parent) {
-		final Label lblSeparator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL );
-		GridData gd_lbl_spacer = new GridData();
-		gd_lbl_spacer.horizontalAlignment = SWT.FILL;
-		lblSeparator.setLayoutData(gd_lbl_spacer);
-		lblSeparator.setAlignment(SWT.CENTER);
-	}
-	
-	/*
-	 * 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();
-		synchHelper.synchCombo(cvImplLib.getCombo(), IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES, null);
-		synchHelper.synchCheckbox(btnDeployJars, IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, null);
-		//not using synch helper for IMPLEMENTATION_TYPE
-//		synchHelper.synchCheckBoxTableViewer(ctvSelCompLib, IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, new Control[]{hiddenList});
-	}
-
-	/**
-	 * 	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;
-			}
-		}
-	}
-	private static class ImplLibCVContentProvider implements IStructuredContentProvider {
-		private List jsfImplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {
-			return jsfImplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfImplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfImplLibs = (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;
-		}
-	}
-	private static class ImplLibCVListLabelProvider extends LabelProvider {
-		private JSFLibrary defaultImpl = null;
-		
-		public String getText(Object element) {
-			if (element instanceof JSFLibraryInternalReference){
-				StringBuffer labelBuf = new StringBuffer(((JSFLibraryInternalReference)element).getLabel());
-				JSFLibrary lib = ((JSFLibraryInternalReference)element).getLibrary();
-				if (getDefaultImpl()!= null && lib != null && lib.getID().equals(getDefaultImpl().getID()))
-					labelBuf.append(" ").append(JSFLibraryRegistry.DEFAULT_IMPL_LABEL); //$NON-NLS-1$
-				return labelBuf.toString() ;
-			}
-			return null;
-		}
-		private JSFLibrary getDefaultImpl() {
-			if (defaultImpl == null){
-				JSFLibraryRegistry jsflibreg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-				defaultImpl = jsflibreg.getDefaultImplementation();
-			}
-			return defaultImpl;
-		}
-		public Image getImage(Object element) {
-			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 1611218..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
- *
- */
-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 945f9ef..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
- *
- */
-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/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 798503f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/BeanSuffixHyperlink.java
+++ /dev/null
@@ -1,117 +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.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.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() {
-		return null;
-	}
-
-	/*
-	 * (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/ELHyperlinkDetector.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/ELHyperlinkDetector.java
deleted file mode 100644
index 8201802..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/ELHyperlinkDetector.java
+++ /dev/null
@@ -1,100 +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.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 files.
- */
-public class ELHyperlinkDetector extends AbstractHyperlinkDetector {
-
-    public final IHyperlink[] detectHyperlinks(final ITextViewer textViewer,
-            final IRegion region, final boolean canShowMultipleHyperlinks) {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-        .getContext(textViewer, region.getOffset());
-        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);
-    }
-
-}
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/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 7d77ce8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JavaElementHyperlink.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.jsf.ui.internal.jspeditor;
-
-import org.eclipse.core.runtime.IStatus;
-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.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() {
-		return null;
-	}
-
-	/*
-	 * (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 e43aca1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
+++ /dev/null
@@ -1,109 +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&lassname:
-JSFFacetInstallPage_JSFURLMappingLabel=&URL Mapping Patterns:
-JSFFacetInstallPage_JSFLibraryLabel0=JSF 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...
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle=Backward compatibility issue
-JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel=Do not show this message again (affects all listed projects)
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText=This project is currently configured for use with an obsolete version of JSF libraries. \
-Changing JSF library settings on this project may break backward compatibility with older versions of JSF tools.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information.
-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_IMPLS_ONLY_DESC=Create a library of jars that make up a JSF implementation library.
-JSFLibraryWizard_CreateImplementation=Create JSF Implementation 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_IsJSFImplementation=Is JSF &Implementation
-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.
-JSFLibraryWizard_V1JSFLibrary_DialogMessage=The projects listed below contain JSF library references that are\
-obsolete and may not be automatically updated by this change. To fix this issue, you need to update these\
-these projects.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information. \n\nProjects: {0}
-JSFLibraryWizard_V1JSFLibrary_DialogTitle=Backward compatibility issue
-
-JSFLibraryConfigControl_ImplementationLibrary=Implementation Library
-JSFLibraryPropertyPage_No_JSF_Facet_Installed=JSF Facet not installed.
-JSFLibraryConfigControl_NewImplementationLibrary=New...
-JSFLibraryConfigControl_ServerSuppliedButtonTooltip=Chosen server adapter must supply the JSF Implementation jars.
-JSFLibraryConfigControl_ServerSuppliedButtonLabel=Server Supplied JSF Implementation
-JSFLibraryConfigControl_NewImplButtonTooltip=Create new user supplied implementation library
-JSFLibraryConfigControl_DeployJAR=Deploy jars to WEB-INF/lib
-JSFLibraryConfigControl_ComponentLibrary=Component Libraries
-JSFLibraryConfigControl_DeployButtonLabel=Deploy
-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.
\ 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 4cb06ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/JSPTagRegistryPreferencePage.java
+++ /dev/null
@@ -1,124 +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.runtime.Assert;
-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.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.jsp.registry.TLDRegistryPreferences;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.TLDRegistryPreferences.StrategyIdentifier;
-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())
-        {
-            _tldRegistryPreferences.commit(getPreferenceStore());
-        }
-    }
-
-    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 8bcf65a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/Messages.java
+++ /dev/null
@@ -1,20 +0,0 @@
-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_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 64b3389..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-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 4874def..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
+++ /dev/null
@@ -1,610 +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.project.facet;
-
-import java.util.ArrayList;
-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.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigDialogSettingData;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-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.jsflibraryconfig.IJSFImplLibraryCreationListener;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFImplLibraryCreationEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControl;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeListener;
-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.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 {
-	// UI
-	private Label lblJSFImpl;
-	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 static final String SETTINGS_DEPLOY_IMPL = "deployImplementation"; //$NON-NLS-1$
-	private static final String SETTINGS_IMPL_TYPE = "deployImplType";//$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB = "selectedComponent"; //$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB_SELECT_DEPLOY = "selectdeploycomplib"; //$NON-NLS-1$
-
-	private static final String SEPARATOR = ":"; //$NON-NLS-1$
-	
-	//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-	private static final String DEFAULT_TO_CLIENT = "initialDefaultToClientSupplied";
-	private static final String DEFAULT_TO_SERVER = "initialDefaultToServerSupplied";
-
-
-	private JSFLibraryConfigControl jsfLibCfgComp = null;
-	// 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);
-
-		lblJSFImpl = new Label(composite, SWT.None);
-		GridData gdLbl = new GridData();
-		gdLbl.verticalIndent = 5;
-		gdLbl.verticalAlignment = SWT.BEGINNING;
-		lblJSFImpl.setLayoutData(gdLbl);
-		lblJSFImpl.setText(Messages.JSFFacetInstallPage_JSFLibraryLabel0);
-		
-		jsfLibCfgComp = new JSFLibraryConfigControl(composite, SWT.NONE);
-		jsfLibCfgComp
-				.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-					public void okClicked(JSFImplLibraryCreationEvent event) {
-						if (event.isLibraryCreated()) {
-							validatePage();
-						}
-					}
-				});
-		
-		jsfLibCfgComp.addChangeListener( new JSFLibraryConfigControlChangeListener(){
-
-			public void changed(JSFLibraryConfigControlChangeEvent e) {
-				validatePage();				
-			}
-			
-		});
-		GridData gd_comp = new GridData();
-		gd_comp.horizontalSpan = 2;
-		gd_comp.grabExcessHorizontalSpace = true;
-		gd_comp.grabExcessVerticalSpace = true;
-		gd_comp.horizontalAlignment = SWT.FILL;
-		jsfLibCfgComp.setLayoutData(gd_comp);
-
-		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();
-
-		this.getContainer().getShell().pack();
-
-		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) {
-		IMPLEMENTATION_TYPE implType = IMPLEMENTATION_TYPE.UNKNOWN;
-		String deployImpl = null;
-		
-		if (root != null) {
-			implType = IMPLEMENTATION_TYPE.getValue(root.get(SETTINGS_IMPL_TYPE));
-			deployImpl = root.get(SETTINGS_DEPLOY_IMPL);
-			
-		}
-				
-		//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-		if (implType == IMPLEMENTATION_TYPE.UNKNOWN) {			
-			// if the impl type is still unknown, check if the product provided a default
-			IPreferenceStore prefs = JSFUiPlugin.getDefault().getPreferenceStore();
-			if(prefs.getBoolean(DEFAULT_TO_CLIENT)) {			
-				implType = IMPLEMENTATION_TYPE.USER_SPECIFIED;
-			}
-			else if(prefs.getBoolean(DEFAULT_TO_SERVER)) {	
-				implType = IMPLEMENTATION_TYPE.SERVER_SUPPLIED;
-			}
-		}
-
-		if (deployImpl == null || deployImpl.equals("")) { //$NON-NLS-1$
-			deployImpl = ((Boolean) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION))
-					.toString();
-		}
-
-		IDialogSettings complibs = null;
-		if (root != null) {
-			complibs = root.getSection(SETTINGS_COMPLIB);
-		}
-
-		String[] selection = null;
-		if (complibs != null) {
-			selection = complibs.getArray(SETTINGS_COMPLIB_SELECT_DEPLOY);
-		}
-
-		JSFLibraryConfiglModelSource source = new JSFLibraryConfigDialogSettingData(implType,
-				Boolean.valueOf(deployImpl).booleanValue(), selection);
-		jsfLibCfgComp.loadControlValuesFromModel(source);
-	}
-
-	
-	private void saveSettings() {
-		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
-		dialogSettings.addSection(root);
-
-		root.put(SETTINGS_IMPL_TYPE, getJSFImplType());
-		root.put(SETTINGS_DEPLOY_IMPL, String.valueOf(getDeployJSFImpl()));
-		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());
-
-		DialogSettings complibs = new DialogSettings(SETTINGS_COMPLIB);
-		root.addSection(complibs);
-		complibs.put(SETTINGS_COMPLIB_SELECT_DEPLOY, getCompLibSelections());
-	}
-
-	private String getJSFImplType() {
-		return IMPLEMENTATION_TYPE.getStringValue((IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME));
-	}
-
-	private boolean getDeployJSFImpl() {
-		if (jsfLibCfgComp.getSelectedJSFLibImplementation() == null) {
-			return false;
-		}
-		return jsfLibCfgComp.getSelectedJSFLibImplementation()
-				.isCheckedToBeDeployed();
-	}
-
-	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();
-	}
-
-	private String[] getCompLibSelections() {
-		/*
-		 * Iterate thru the selected component libraries and return selected
-		 * component libraries and their deployment flags in a string array.
-		 */
-		JSFLibraryInternalReference complib = null;
-		String str = null;
-		ArrayList al = new ArrayList();
-
-		java.util.List list = jsfLibCfgComp.getSelectedJSFLibComponents();
-		Iterator it = list.iterator();
-		while (it.hasNext()) {
-			complib = (JSFLibraryInternalReference) it.next();
-			str = complib.getID() + SEPARATOR + complib.isCheckedToBeDeployed();
-			al.add(str);
-		}
-
-		return (String[]) al.toArray(new String[al.size()]);
-	}
-
-	/*
-	 * (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() {
-		saveSettings(); // convenient place for this. don't want to save if user
-						// cancelled.
-		// do nothing else now. being handled by synchHelper
-		// config.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION,
-		// getJSFImpl());
-//		model
-//				.setStringProperty(
-//						IJSFFacetInstallDataModelProperties.CONFIG_PATH,
-//						getJSFConfig());
-//		model.setStringProperty(
-//				IJSFFacetInstallDataModelProperties.SERVLET_NAME,
-//				getJSFServletName());
-		// config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-		// getJSFPatterns());
-
-//		java.util.List implLibs = new ArrayList();
-//		implLibs.add(jsfLibCfgComp.getSelectedJSFLibImplementation());
-//		java.util.List compLibs = jsfLibCfgComp.getSelectedJSFLibComponents();
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES,
-//				implLibs);
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES,
-//				compLibs);
-	}
-
-	private void addModificationListeners() {
-		 jsfLibCfgComp.setSynchHelper(synchHelper);		 
-		 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);
-		 
-		// synchHelper.synchCheckbox(chkDeployImpl, DEPLOY_IMPLEMENTATION,
-		// 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() {
-		return new String[] { IMPLEMENTATION_TYPE_PROPERTY_NAME, IMPLEMENTATION, DEPLOY_IMPLEMENTATION,
-				CONFIG_PATH, SERVLET_NAME, SERVLET_CLASSNAME, COMPONENT_LIBRARIES };
-	}
-
-	/* (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() {
-		initializeValues();
-
-		checkToCompletePage(jsfLibCfgComp);
-	}
-
-	/*
-	 * To force a JSF facet install page configuration to be performed    
-	 * when the JSF facet is selected but no JSF implementation library exists.
-	 */
-	private void checkToCompletePage(Composite control) {
-		boolean enableFinish = false;
-		IMPLEMENTATION_TYPE implType = (IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME);
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED)
-			enableFinish = true;
-		else if (implType == IMPLEMENTATION_TYPE.USER_SPECIFIED && 
-				control != null && control instanceof JSFLibraryConfigControl) {
-			enableFinish = (((JSFLibraryConfigControl)control).getSelectedJSFLibImplementation() != null);
-		} //else must be unknown type and requires user interaction
-		setPageComplete(enableFinish);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#showValidationErrorsOnEnter()
-	 */
-	protected boolean showValidationErrorsOnEnter() {
-		return true;
-	}
-
-
-}
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 47b0a72..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";
-    private static final String INTERFACES_SECTION_KEY = "interfacesSection";
-    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, "Component Type Information");
-        sections.put(COMPONENT_TYPE_SECTION_KEY, _componentTypeSection);
-        
-        _interfacesSection = new XMLTextSection(getToolkit(), parent, "Interface Information");
-        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 19fdacf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ConverterDetailsForm.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.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.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";
-    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, "Converter Type Information");
-        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 formatText = "<form><p><b>Class:</b> %s</p>  <p><b>Converter Id:</b> %s</p></form>";
-                final String className = typeInfo.getClassName();
-                final String converterId = typeInfo.getConverterId();
-
-                _converterTypeSection.setText(String.format(formatText,
-                        className == null ? "" : className,
-                        converterId == null ? "" : converterId), 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 bd4cb1d..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");
-    }
-
-    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/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 6891180..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/NamespaceDetailsForm.java
+++ /dev/null
@@ -1,69 +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.swt.widgets.Composite;
-
-
-/**
- * Details form for a namespace
- * 
- * @author cbateman
- *
- */
-public class NamespaceDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  NAMESPACE_SECTION_KEY = "namespaceSection";
-    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, "Namespace");
-        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 formatText = "<form><p><b>Name:</b> %s</p> <p><b>Uri:</b> %s</p> </form>";
-            final String displayName = namespace.getDisplayName();
-            final String uri = namespace.getNSUri();
-
-            _namespaceSection.setText(String.format(formatText,
-                    displayName == null ? "" : displayName,
-                    uri == null ? "" : uri
-                    ), 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 ea2f5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java
+++ /dev/null
@@ -1,207 +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.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();
-        _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
-            // EventType eventType = event.getEventType();
-            if (event.getEventType() == EventType.RESOURCE_ADDED
-                    && event.getReasonType() == ReasonType.PROJECT_OPENED
-                    && res instanceof IProject)
-            {
-                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 3bd136c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryDetailsForm.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.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.TagRegistryFactoryInfo;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TagRegistryInstance;
-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";
-    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,
-                "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 TagRegistryFactoryInfo info = tagRegistry.getInfo();
-
-            if (info != null)
-            {
-                final String format = "<form><p><b>Description:</b> %s</p> <p><b>Id:</b> %s</p> <p><b>Content-Types:</b> %s</p></form>";
-                final String description = info.getDescription();
-                final String id = info.getId();
-                final Set<IContentType> contentTypes = info.getContentTypes();
-                String contentTypeLabel = "";
-                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() + ",";
-                }
-
-                if (it.hasNext())
-                {
-                    final IContentType ctype = it.next();
-                    contentTypeLabel += ctype.getName();
-                }
-
-                _tagRegistrySection.setText(String.format(format, description,
-                        id, contentTypeLabel), 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 7ea7844..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterForm.java
+++ /dev/null
@@ -1,497 +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.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 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");
-
-        _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("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");
-        }
-        _refreshAction = new RefreshAction(_registryTreeViewer);
-        _refreshAction.setText("Refresh Registry");
-        _refreshAction.setToolTipText("Refresh Registry");
-        _refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault()
-                .getImageDescriptor("refresh_nav_16.gif"));
-        
-        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(), "Also flush cached data?", null, // accept
-                    // the
-                    // default
-                    // window
-                    // icon
-                    "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"
-                    , 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
-    {
-        @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 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.gif");
-            }
-
-            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 5ef7c85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryView.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.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 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("obj16/library_obj.gif"));
-    }
-
-    /**
-     * 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 cf0d03b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TaglibContentProvider.java
+++ /dev/null
@@ -1,451 +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.Namespace;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.TagRegistryFactoryInfo;
-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.ITagRegistry.TagRegistryChangeEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent.EventType;
-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<TagRegistryFactoryInfo> factories = CompositeTagRegistryFactory
-                    .getInstance().getAllTagRegistryFactories();
-
-            _curTagRegistries.clear();
-
-            for (TagRegistryFactoryInfo 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);
-                }
-            }
-        }
-        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("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("Updating namespace")
-            {
-                @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(),
-                                                        "Error updating namespace",
-                                                        "There was a problem initializing the namespace");
-                                    }
-                                }
-                            });
-                    return Status.OK_STATUS;
-                }
-            };
-
-            updateNamespaceJob.schedule();
-
-            return new Object[]
-            { new TreePlaceholder("Calculating tags, please wait...", null) };
-        }
-//        else if (parentElement instanceof IJSFTagElement)
-//        {
-//            return new Object[]
-//            { ((IJSFTagElement) parentElement).toString() };
-//        }
-
-        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 "
-                    + 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, "");
-            }
-
-            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 TagRegistryFactoryInfo        _info;
-        private final ITagRegistry                  _registry;
-        private final Map<String, Namespace>        _namespaces;
-        private boolean                             _isUpToDate;
-
-        public TagRegistryInstance(final TagRegistryFactoryInfo info,
-                ITagRegistry registry)
-        {
-            _info = info;
-            _registry = registry;
-            _namespaces = new ConcurrentHashMap<String, Namespace>();
-        }
-
-        public TagRegistryFactoryInfo 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 207cb56..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.swt.widgets.Composite;
-
-/**
- * Details form for validator tags.
- * @author cbateman
- *
- */
-public class ValidatorDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  VALIDATOR_TYPE_SECTION_KEY = "validatorSection";
-    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, "Validator Type Information");
-        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 formatText = "<form><p><b>Class:</b> %s</p>  <p><b>Validator Id:</b> %s</p></form>";
-                final String className = typeInfo.getClassName();
-                final String validatorId = typeInfo.getValidatorId();
-
-                _validatorTypeSection.setText(String.format(formatText,
-                        className == null ? "" : className,
-                        validatorId == null ? "" : validatorId), true, false);
-                _validatorTypeSection.refresh();
-            }
-        }
-    }
-}
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 1ac1c72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidator.java
+++ /dev/null
@@ -1,148 +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.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.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");
-        }
-
-        final IFile file = getFile(helper);
-
-        if (fDocument instanceof IStructuredDocument)
-        {
-            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();
-
-                final ValidationReporter jsfReporter = new ValidationReporter(
-                        this, reporter, file, prefs);
-                validator.validateView(file, regions, jsfReporter);
-            }
-        }
-    }
-
-    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();
-    
-            final ValidationReporter jsfReporter = new ValidationReporter(this,
-                    reporter, file, prefs);
-            validator.validateView(file, jsfReporter);
-        }
-    }
-
-    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/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 99dcd24..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() : "";
-    }
-    
-    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";
-        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);
-                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 1aee971..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());
-        }
-
-        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 0772e66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationMessageFactory.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.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.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;
-
-    /**
-     * @param prefs
-     * 
-     */
-    public ValidationMessageFactory(final ValidationPreferences prefs)
-    {
-        _strategies = new HashMap<String, SeverityOverrideStrategy>();
-        _strategies.put(DiagnosticFactory.SOURCE_ID,
-                new ELSeverityOverrideStrategy(prefs));
-        _strategies.put(TypeComparatorDiagnosticFactory.SOURCE_IDENTIFIER,
-                new TypeComparatorOverrideStrategy(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);
-
-        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 "EL Preference Severities";
-        }
-    }
-
-    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 "Type Comparison Preference Severities";
-        }
-    }
-}
\ 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 e5f0411..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationReporter.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.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.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)
-    {
-        _validator = validator;
-        _reporter = reporter;
-        _file = file;
-        _factory = new ValidationMessageFactory(prefs);
-    }
-
-    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 6fc9f74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
+++ /dev/null
@@ -1,72 +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
\ No newline at end of file
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 a09df04..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Tue Oct 23 12:01:25 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.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 f82c3e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,40 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsf.ui;singleton:=true
-Bundle-Version: 1.1.1.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,1.2.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)"
-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.celleditors;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 f148ced..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,177 +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">
-		<tagConverterFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore.JSFCoreConverterFactory" />
-		<tagConverterFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml.JSFHTMLConverterFactory" />
-		<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 16992f7..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")))
-                {
-                    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)))
-            {
-                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());
-    }
-
-    /**
-     * @param ele 
-     * @return true if the local name of ele is "param"
-     */
-    public static boolean isUIParameter(Element ele)
-    {
-        return "param".equals(ele.getLocalName());
-    }
-
-}
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 ec0e9dd..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");
-        }
-        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("/");
-    }
-
-    /**
-     * 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));
-                images.put(name, id);
-
-                image = images.get(name);
-            }
-            catch (MalformedURLException ee)
-            {
-                _logger.error("Error.JSFUIPlugin", name, ee); //$NON-NLS-2$
-            }
-        }
-        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",
-    			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",
-    			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 fe9abaf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.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
-###############################################################################
-MessageTagConverter.defaultValue=Message
-MessageTagConverter.defaultTooltip=Summary
\ 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 a0d0e73..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"});
-    }
-}
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 3dcdaf0..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"});
-//        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 67b2e30..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);
-        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 9124e34..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);
-        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 3204dca..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$
-        }
-        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$
-    }
-
-    /**
-     * @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 52883b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.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.jsf.ui.actions;
-
-import java.util.Iterator;
-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.JSFAppConfigManager;
-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;
-        
-        JSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManager.getInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List list = appConfigMgr.getValidators();
-            result = new String[list.size()];
-            int i = 0;
-            for (final Iterator it = list.iterator(); it.hasNext();) 
-            {
-                ValidatorType validator = (ValidatorType) it.next();
-                ValidatorIdType validatorId = validator.getValidatorId();
-                if (validatorId != null)
-                {
-                    result[i++] = validatorId.getTextContent() != null ?
-                            validatorId.getTextContent().trim() : "";
-                }
-            }
-        }
-        return result;
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredConverterIds(IProject project) 
-    {
-        String[] result = null;
-        
-        JSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManager.getInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List list = appConfigMgr.getConverters();
-            result = new String[list.size()];
-            int i = 0;
-            for (final Iterator it = list.iterator(); it.hasNext();)
-            {
-                ConverterType converter = (ConverterType) it.next();
-                ConverterIdType converterId = converter.getConverterId();
-                if (converterId != null)
-                {
-                    result[i++] = converterId.getTextContent() != null ? 
-                            converterId.getTextContent().trim() : "";
-                }
-            }
-        }
-		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 52a6b76..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");
-            JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f");
-
-            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;
-
-    }
-
-    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=\"");
-            sb.append(linkExp);
-            sb.append("\">");
-            sb.append("</h:outputText>\n</h:commandLink>");
-            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 d485664..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");
-            String fPrefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f");
-
-            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;
-    
-    }
-
-    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>");
-            sb.append(linkExp);
-            sb.append("</f:verbatim>\n</h:outputLink>");
-            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 b13fa30..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";
-    /**
-     * possible key in the param map
-     */
-    static final String Project = "project";
-
-    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 ab8c300..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());
-    	}
-
-        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';//$NON-NLS-1$ //$NON-NLS-2$
-        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];//$NON-NLS-1$
-            }
-            int newPos = 1;
-            for(int i=1; i<chars.length; i++,newPos++)
-            {
-                if(chars[i] >= 'A' && chars[i] <= 'Z')//$NON-NLS-1$ //$NON-NLS-2$
-                {
-                    newChars[newPos++] = ' ';//$NON-NLS-1$
-                }
-                newChars[newPos] = chars[i];
-            }
-            char[] labelChars = new char[newPos + 1];
-            System.arraycopy(newChars,0,labelChars,0,newPos);
-            labelChars[newPos] = ':';//$NON-NLS-1$
-            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/celleditors/ConverterValidatorIdDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java
deleted file mode 100644
index ef36d11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.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.jsf.ui.celleditors;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-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 class ConverterValidatorIdDialogField extends ComboDialogField implements IElementContextable
-{
-    private String _elementId = "";
-
-    /**
-     * The default constructor
-     */
-    public ConverterValidatorIdDialogField()
-    {
-        super(SWT.NONE);
-    }
-
-    /* (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)
-    {
-        setItems(new String[0]);
-    }
-
-    /**
-     * @return the element id
-     */
-    public String getElementId()
-    {
-        return _elementId;
-    }
-
-    /**
-     * Set the element id
-     * 
-     * @param elementId
-     */
-    public void setElementId(String elementId)
-    {
-        this._elementId = elementId;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java
deleted file mode 100644
index 476a096..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.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.jsf.ui.celleditors;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.celleditors.LabeledComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public class JSFAttributeCellEditorFactory implements IAttributeCellEditorFactory
-{
-    private static final String CONVERTERID = "converterId"; //$NON-NLS-1$
-    private static final String VALIDATORID = "validatorId"; //$NON-NLS-1$
-
-    /**
-     * The constructor
-     */
-    public JSFAttributeCellEditorFactory()
-    {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#createCellEditor(org.eclipse.swt.widgets.Composite, org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor, org.w3c.dom.Element)
-     */
-    public CellEditor createCellEditor(Composite parent, IAttributeDescriptor attr, Element element)
-    {
-        String type = attr.getValueType();
-
-        if (type.equalsIgnoreCase(CONVERTERID))
-        {
-            Map map = new HashMap();
-            return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-        }
-        else if (type.equalsIgnoreCase(VALIDATORID))
-        {
-            Map map = new HashMap();
-            return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor, org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    public DialogField createDialogField(IAttributeDescriptor attr)
-    {
-        String type = attr.getValueType();
-
-        if (type.equalsIgnoreCase(CONVERTERID))
-        {
-            ConverterValidatorIdDialogField dialogField = new ConverterValidatorIdDialogField();
-            dialogField.setElementId("converter-id");
-            dialogField.setRequired(attr.isRequired());
-            dialogField.setToolTip(attr.getDescription());
-            return dialogField;
-        }
-        else if (type.equalsIgnoreCase(VALIDATORID))
-        {
-            ConverterValidatorIdDialogField dialogField = new ConverterValidatorIdDialogField();
-            dialogField.setElementId("validator-id");
-            dialogField.setRequired(attr.isRequired());
-            dialogField.setToolTip(attr.getDescription());
-            return dialogField;
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#getSupportedValueTypes()
-     */
-    public String[] getSupportedValueTypes()
-    {
-        return new String[] { CONVERTERID, VALIDATORID};
-    }
-}
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 a57f4f7..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());
-            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 d3276ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.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.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
- */
-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 7cb56ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.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.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
- */
-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")
-            .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);
-            return;
-        }
-        catch (IOException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.IOException", e);
-            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 b6b6c27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.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.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
- */
-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 b86d978..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.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.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
- */
-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, ", ");
-                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(" ");
-            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 e441ba3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.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.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
- */
-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
-            }
-        }
-        else
-        {
-            type = "image";
-            // 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 dcf09dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.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.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
- */
-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, "#");
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style;
-            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 d4cc641..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
- */
-public class DataTableTagConverter extends AbstractTagConverter
-{
-    private static final String FACET_NAME_HEADER = "header";
-
-    /**
-     * @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, ", ");
-            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, ", ");
-            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");
-        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");
-            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");
-                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 4705201..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.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.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
- */
-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 865e9aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.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.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
- */
-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 845c9d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.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
- */
-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 da4a9ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.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
- */
-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 5bf099f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.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.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
- */
-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");
-        }
-        else if (IJSFConstants.TAG_INPUTTEXT.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "text");
-        }
-        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");
-        }
-        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");
-        }
-        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 6c87783..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.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.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
- */
-public class MessageTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue");
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip");
-
-    /**
-     * @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))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null))
-        {
-            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))
-        {
-            if ("true".equalsIgnoreCase(showSummary))
-            {
-                spanEle.setAttribute("title", MESSAGE_TOOLTIP);
-            }
-        }
-        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 5926405..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.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 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
- */
-public class MessagesTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue");
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip");
-
-    /**
-     * @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");
-            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))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null))
-        {
-            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))
-        {
-            if ("true".equalsIgnoreCase(showSummary))
-            {
-                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 73ea98e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.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.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
- */
-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 f90bdf9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.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.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
- */
-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, "#");
-
-        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;
-            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 0897a59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.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.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
- */
-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 a163cee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
- */
-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");
-        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");
-        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, ", ");
-            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, ", ");
-            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 d98d241..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.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.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
- */
-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 151b8c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.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.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
- */
-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 b0b2720..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.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.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
- */
-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");
-        
-        if ("true".equalsIgnoreCase(inputEle.getAttribute(IHTMLConstants.ATTR_VALUE)))
-        {
-            inputEle.setAttribute(IHTMLConstants.ATTR_CHECKED,"checked");
-        }
-        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 089c92f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
- */
-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";
-        }
-    }
-}
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 abc3ab6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.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
- */
-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");
-
-        // 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");
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size()));
-            }
-        }
-    }
-
-}
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 e6ead1f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.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.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-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");
-
-        // 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");
-    }
-
-}
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 e1a0493..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.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.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-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");
-
-        // 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");
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size()));
-            }
-        }
-    }
-}
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 1bb5db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.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.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-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");
-
-        selectEle.setAttribute("size", "1");
-    }
-
-}
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 0beeac4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.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.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
- */
-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)));
-                    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");
-                    item1.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item1);
-                    SelectItemModel item2 = new SelectItemModel();
-                    item2.setValue(value + "_2");
-                    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");
-        }
-        else if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTMANYCHECKBOX))
-        {
-            item.setLabel("checkBox");
-        }
-        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 043b82d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.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.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
- */
-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)))
-        {
-            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");
-            }
-            if (isReadonly)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly");
-            }
-
-            // 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 2d5c3b9..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,90 +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");
-
-		//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")) {
-			//tokenize "columnClasses" attribute into a List
-			List columnClassesList = new ArrayList();
-			String columnClassesAttribute = ((Element)parentNode).getAttribute("columnClasses");
-			if (columnClassesAttribute != null && columnClassesAttribute.length() > 0) {
-				StringTokenizer tokenizer = new StringTokenizer(columnClassesAttribute, ", ");
-				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)});
-				operation.transform(srcElement, tdElement);
-			}
-		}
-
-		//add non-transparent (?), non-facet children (for further processing)
-        if (EditModelQuery.getInstance().hasNonTransparentChild(srcElement, new String[] {"facet"})) {
-        	Node childNode = srcElement.getFirstChild();
-        	int index = 0;
-        	while (childNode != null) {
-        		if (!(childNode instanceof Element) || !JSFDOMUtil.isFacet((Element)childNode)) {
-        			tagConverterContext.addChild(childNode, new ConvertPosition(tdElement, index++));
-        		}
-        		childNode = childNode.getNextSibling();
-        	}
-        } else {
-        	//append single space for esthetics of the "td" Element
-        	appendChildText(" ", tdElement);
-        }
-
-		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 3d0461b..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");
-		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"});
-		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";
-		String headerOrFooterTagName = isHeader ? "thead" : "tfoot";
-		String thOrTdTagName = isHeader ? "th" : "td";
-		String headerClassOrFooterClassAttrName = isHeader ? "headerClass" : "footerClass";
-
-		//look for facet ("header" or "footer")
-		Element facetElement = getChildFacetByName(srcElement, facetName);
-
-		//get list of child "column" elements
-		List columnElementList = getChildElements(srcElement, "column");
-
-		//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);
-			//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});
-				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())});
-				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);
-			//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});
-					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);
-		//append "tr" element
-		Element trElement = appendChildElement("tr", tbodyElement);
-		//parse "rowClasses" attribute and set "class" attribute
-		String rowClassesAttribute = srcElement.getAttribute("rowClasses");
-		if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-			StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", ");
-			if (tokenizer.hasMoreTokens()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", tokenizer.nextToken()});
-				operation.transform(srcElement, trElement);
-			}
-		}
-		//add child columns (to be processed further)
-		List columnElementList = getChildElements(srcElement, "column");
-		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");
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			if (facet.getAttribute("name").equals(facetName)) {
-				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 4299133..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,152 +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.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);
-							IPath webRootPath = component.getRootFolder().getProjectRelativePath();
-							StringBuffer sb = new StringBuffer(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);
-									} 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 0ebb2fc..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");
-		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"});
-		operation.transform(srcElement, tableElement);
-		//get value of "columns" attribute
-		int columns;
-		try {
-			columns = Integer.parseInt(srcElement.getAttribute("columns"));
-		} catch(NumberFormatException nfe) {
-			columns = 1;
-		}
-		if (columns < 1) {
-			columns = 1;
-		}
-		//check for "header" facet and render appropriately
-		Element headerFacetElement = getChildFacetByName(srcElement, "header");
-		if (headerFacetElement != null) {
-			Element tHeadElement = appendChildElement("thead", tableElement);
-			Element trElement = appendChildElement("tr", tHeadElement);
-			Element thElement = appendChildElement("th", trElement);
-			String headerClass = srcElement.getAttribute("headerClass");
-			if (headerClass != null && headerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClass});
-				operation.transform(srcElement, thElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)});
-			operation.transform(srcElement, thElement);
-			tagConverterContext.addChild(headerFacetElement, new ConvertPosition(thElement, 0));
-		}
-		//check for "footer" facet and render appropriately
-		Element footerFacetElement = getChildFacetByName(srcElement, "footer");
-		if (footerFacetElement != null) {
-			Element tFootElement = appendChildElement("tfoot", tableElement);
-			Element trElement = appendChildElement("tr", tFootElement);
-			Element tdElement = appendChildElement("td", trElement);
-			String footerClass = srcElement.getAttribute("footerClass");
-			if (footerClass != null && footerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", footerClass});
-				operation.transform(srcElement, tdElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)});
-			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");
-        if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-            StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", ");
-            while (tokenizer.hasMoreTokens()) {
-                rowClasses.add(tokenizer.nextToken());
-            }
-        }
-        List columnClasses = new ArrayList();
-        String columnClassAttribute = srcElement.getAttribute("columnClasses");
-        if (columnClassAttribute != null) {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassAttribute, ", ");
-            while (tokenizer.hasMoreTokens()) {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-		//render children using appropriate number of columns and appropriate classes
-        Element tBodyElement = appendChildElement("tbody", tableElement);
-        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);
-        		if (!rowClasses.isEmpty()) {
-    				operation =
-    					TransformOperationFactory.getInstance().getTransformOperation(
-    							TransformOperationFactory.OP_CreateAttributeOperation,
-    							new String[]{"class", (String)rowClasses.get(nextRow)});
-    				operation.transform(srcElement, trElement);
-        			nextRow = (nextRow + 1) % rowClasses.size();
-        		}
-        	}
-        	Element tdElement = appendChildElement("td", trElement);
-        	if (columnIndex < columnClasses.size()) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClasses.get(columnIndex)});
-				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");
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name");
-			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")) {
-					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 5497bbf..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";
-	}
-
-}
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 891c060..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";
-	}
-
-}
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 e801d4d..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,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:
- *    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.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");
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"styleClass"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"style"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"border"});
-		operation.transform(srcElement, tableElement);
-		boolean layoutHorizontal = true;
-		if ("pageDirection".equalsIgnoreCase(srcElement.getAttribute("layout"))) {
-			layoutHorizontal = false;
-		}
-		Element itemContainer;
-		if (layoutHorizontal) {
-			itemContainer = appendChildElement("tr", tableElement);
-		} else {
-			itemContainer = tableElement;
-		}
-		boolean isDisabled = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("disabled"));
-		boolean isReadOnly = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("readonly"));
-		List selectItemList = getChildElements(srcElement, "selectItem");
-		Iterator itSelectItemList = selectItemList.iterator();
-		while (itSelectItemList.hasNext()) {
-			Element selectItem = (Element) itSelectItemList.next();
-			Element labelElement = createElement("label");
-			Element inputElement = appendChildElement("input", labelElement);
-			inputElement.setAttribute("type", getInputType());
-			if (isDisabled || Boolean.TRUE.toString().equalsIgnoreCase(selectItem.getAttribute("itemDisabled"))) {
-				inputElement.setAttribute("disabled", "disabled");
-			}
-			if (isReadOnly) {
-				inputElement.setAttribute("readonly", "readonly");
-			}
-			String selectItemID = selectItem.getAttribute("id");
-			if (selectItemID != null && selectItemID.length() > 0) {
-				inputElement.setAttribute("id", selectItemID);
-			}
-			String selectItemValue = selectItem.getAttribute("value");
-			if (selectItemValue != null && selectItemValue.length() > 0) {
-				inputElement.setAttribute("value", selectItemValue);
-			}
-			String label = getSelectItemLabel(selectItem);
-			appendChildText(label, labelElement);
-			if (layoutHorizontal) {
-				Element tdElement = appendChildElement("td", itemContainer);
-				tdElement.appendChild(labelElement);
-			} else {
-				Element trElement = appendChildElement("tr", itemContainer);
-				Element tdElement = appendChildElement("td", trElement);
-				tdElement.appendChild(labelElement);
-			}
-		}
-		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");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("value");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemDescription");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemValue");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		return "selectItem";
-	}
-
-}
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 ac60adb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
-    {
-        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.gif");
-                _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 2bfcd06..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-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")
-                || _localName.startsWith("select");
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isEditableValueHolder()
-         */
-        public boolean isEditableValueHolder()
-        {
-            // UIInput
-            return _localName.startsWith("input") || _localName.startsWith("select");
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#supportSelectItems()
-         */
-        public boolean supportSelectItems()
-        {
-            return _localName.startsWith("select");
-        }
-
-    }
-}
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 a6f3602..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");
-        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 bc57d28..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);
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null);
-        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);
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null);
-        //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");
-            if ("header".equalsIgnoreCase(attrName))
-            {
-                return 0;
-            }
-            else if ("footer".equalsIgnoreCase(attrName))
-            {
-                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 af64865..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 = "";
-        }
-
-        if (!_timeStyleField.isEnabled() || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            timeStyle = "";
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = "";
-
-        }
-
-        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);
-        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 3765751..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 = "";
-        }
-
-        if (!_currencyCodeField.isEnabled())
-        {
-            currencyCode = "";
-        }
-
-        if (!_currencySymbolField.isEnabled())
-        {
-            currencySymbol = "";
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = "";
-        }
-
-        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);
-        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 3e3626c..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"};
-
-    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");
-                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(""))
-        			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 8c70c1a..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); //$NON-NLS-1$
-                        attrs.put(IJSFConstants.ATTR_SIZE, size); //$NON-NLS-1$
-                    }
-                }
-                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 7f2be0e..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"};
-
-    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";
-                }
-                else if (columnIndex == 2)
-                {
-                    attrName = "itemValue";
-                }
-                else if (columnIndex == 3)
-                {
-                    attrName = "id";
-                }
-
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getNodeName();
-                        break;
-                    default:
-                    {
-                        attrNode = node.getAttributes().getNamedItem(attrName);
-                        if (attrNode != null)
-                        {
-                            result = attrNode.getNodeValue()!=null ? attrNode.getNodeValue() : " - ";
-                        }
-                        else
-                        {
-                            result = " - ";
-                        }
-                    }
-                }
-            }
-            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");
-        labelColumn.setWidth(100);
-
-        final TableColumn valueColumn = new TableColumn(_choiceTable, SWT.NONE);
-        valueColumn.setText("itemValue");
-        valueColumn.setWidth(100);
-
-        final TableColumn idColumn = new TableColumn(_choiceTable, SWT.NONE);
-        idColumn.setText("id");
-        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"))
-                {
-                    return ! property.equals("choices");
-                }
-
-                return property.equals("id");
-            }
-
-            public Object getValue(final Object element, final String property) {
-                final IDOMElement node = (IDOMElement) element;
-                final String val = node.getAttribute(property) != null ? node.getAttribute(property) : "";
-                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 82906ce..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";
-    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);
-        }
-    }
-
-    /**
-     * @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 2f9ad38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 11:11:41 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.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.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.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 fa63ae7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsp.core;singleton:=true
-Bundle-Version: 1.1.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)",
- javax.servlet;bundle-version="[2.4.0,3.0.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.0.0)",
- org.apache.commons.el;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
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 0a7f053..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_BODY = "body";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ELEMENT = "element";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_EXPRESSION = "expression";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DECLARATION = "declaration";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_INCLUDE = "directive.include";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_PAGE = "directive.page";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_TAGLIB = "directive.taglib";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DOBODY = "doBody";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_FORWARD = "forward";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_GETPROPERTY = "getProperty";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INCLUDE = "include";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INVOKE = "invoke";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_OUTPUT = "output";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_PLUGIN = "plugin";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ROOT = "root";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SCRIPTLET = "scriptlet";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SETPROPERTY = "setProperty";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_TEXT = "text";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_USEBEAN = "useBean";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_LEADING_DIRECTIVE = "directive.";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ALIGN = "align";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ARCHIVE = "archive";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_BEANNAME = "beanName";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CLASS = "class";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODE = "code";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODEBASE = "codebase";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEROOTELEMENT = "doctype-root-element";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPESYSTEM = "doctype-system";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEPUBLIC = "doctype-public";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FILE = "file";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FRAGMENT = "fragment";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HEIGHT = "height";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HSPACE = "hspace";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ID = "id";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_IEPLUGINURL = "iepluginurl";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_JREVERSION = "jreversion";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NAME = "name";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NSPLUGINURL = "nspluginurl";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_OMITXMLDECLARATION = "omit-xml-declaration";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PAGE = "page";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PROPERTY = "property";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_SCOPE = "scope";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TRIM = "trim";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TYPE = "type";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_URI = "uri";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VALUE = "value";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VAR = "var";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VARREADER = "varReader";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VERSION = "version";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSJSP = "xmlns:jsp";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSTAGLIBPREFIX = "xmlns:taglibPrefix";
-}
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 296abe6..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 = "#{";
-
-	/**
-	 * an EL right brace
-	 */
-	public static String JSF_EL_RIGHT_BRACE = "}";
-
-	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("${'${'}");
-					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("${");
-					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: '"
-								+ expressionString + "'");
-			}
-
-			int indexofClosingBrace = expressionString.indexOf('}', i);
-			i = minIndex(indexofClosingBrace, findQuote(expressionString, i));
-
-			if (i < 0) {
-				// No delimiter found
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '"
-								+ expressionString + "'");
-			}
-
-			// 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: '"
-									+ expressionString + "'");
-				}
-			} 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 3226c9d..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";
-
-	/**
-	 * taglib
-	 */
-	public static final String TAGLIB = "taglib";
-
-	/**
-	 * tag
-	 */
-	public static final String TAG = "tag";
-
-	/**
-	 * varName
-	 */
-	public static final String VARNAME = "varName";
-
-	/**
-	 * varNameIsAttr
-	 */
-	public static final String VARNAMEISATTR = "varNameIsAttr";
-
-	/**
-	 * varTypeMode
-	 */
-	public static final String VARTYPEMODE = "varTypeMode";
-
-	/**
-	 * tagName
-	 */
-	public static final String TAGNAME = "tagName";
-
-	/**
-	 * varTypeString
-	 */
-	public static final String VARTYPESTRING = "varTypeString";
-
-	/**
-	 * varTypeStringIsAttr
-	 */
-	public static final String VARTYPESTRINGISATTR = "varTypeStringIsAttr";
-
-	/**
-	 * uri
-	 */
-	public static final String URI = "uri";
-
-	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]
-								.getAttribute(VARNAMEISATTR));
-						String varTypeString = tags[k]
-								.getAttribute(VARTYPESTRING);
-						boolean varTypeStringIsAttr = "true"
-								.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);
-					}
-				}
-			}
-		}
-
-		return map;
-	}
-
-	/**
-	 * @param varTypeModeString
-	 * @return variable typemode
-	 */
-	public static int toVarTypeMode(String varTypeModeString) {
-		if ("CLASSNAME".equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.CLASSNAME;
-		} else if ("EXPRESSION".equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION;
-		} else if ("EXPRESSION_COLLECTION_ITEM"
-				.equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION_LISTITEM;
-		} else if ("BUNDLE".equalsIgnoreCase(varTypeModeString)) {
-			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;
-		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();
-	}
-}
